UIViewController поворачивают методы

Извиняюсь, если это довольно сложный вопрос, я стараюсь предоставить ключевые слова / фразы, чтобы вы могли искать, чтобы узнать больше.

Предполагая, что вы ищете отдельное среднее значение для каждого студента:

in_file = open('classgrades.txt', 'r')  # python naming style is under_score
out_file = open('classcores.txt', 'w')
all_grades = []  # if you want a class-wide average as well as individual averages

for line in in_file:
    # make a list of the things between spaces, like ["studentname", "90", "100"]
    student = line.split(' ')[0]

    # this next line includes "list comprehension" and "list slicing"
    # it gets every item in the list aside from the 0th index (student name),
    # and "casts" them to integers so we can do math on them.
    grades = [int(g) for g in line.split(' ')[1:]]

    # hanging on to every grade for later
    all_grades += grades  # lists can be +='d like numbers can

    average = int(sum(grades) / len(grades))

    # str.format() here is one way to do "string interpolation"
    out_file.write('{} {}\n'.format(student, average))

total_avg = sum(all_grades) / len(all_grades)
print('Class average: {}'.format(total_avg))
in_file.close()
out_file.close()

Как отмечали другие, полезно привыкнуть к закрытию файлов. Другие ответы здесь используют with open() (в качестве «диспетчера контекста»), что является наилучшей практикой, поскольку оно автоматически закрывает файл для вас. Чтобы работать с двумя файлами без контейнера данных (например, словарь Амита d1), вы должны сделать что-то вроде:

with open('in.txt') as in_file:
    with open('out.txt', 'w') as out_file:
        ... do things ...
17
задан Dolda2000 13 February 2014 в 07:40
поделиться

4 ответа

Кажется, что UIApplication отправляет сообщение активному контроллеру представления.

, Но как Ваш Экземпляр контроллера Представления получает эти сообщения?

сообщение передается к первому контроллеру представления, представление которого было добавлено к UIWindow экземпляр.

Это сводится к 3 основным сценариям:

  1. ViewController, представление которого добавляется непосредственно к UIWindow экземпляр (единственное приложение представления)

  2. Контроллер навигации в основанном на навигации приложении, затем контроллер навигации, передает сообщение к активному контроллеру представления представлений.

  3. Контроллер панели вкладок в основанном на панели вкладок приложении, затем контроллер панели вкладок передает сообщение к активному контроллеру представления представлений (или активному контроллеру навигации).

проблема, которую Вы будете иметь, то, если Вы создаете приложение с несколькими представлениями, но НЕ используете панель контроллера Навигации или контроллер Панели вкладок. При загрузке представлений и из UIWindow экземпляр вручную Вы не получите эти сообщения надежно. Это подобно сообщениям как этот: iPhone viewWillAppear, не стреляя

Просто конвенции Apple использования для нескольких представлений и Вас быть прекрасными. Надежда это сохраняет кого-то час или два

13
ответ дан 30 November 2019 в 13:34
поделиться

Это - все Волшебство, о котором Вы Никогда не Волнуетесь. Просто добавьте корневое представление своего контроллера к окну - или заставьте панель вкладок или контроллер навигации делать это для Вас - и это получит эти сообщения.

(Но если Вы вводите по абсолютному адресу вокруг с отладчиком, Вы могли бы прийти к тому же заключению, что я имею: существует своего рода внутренняя таблица, отображающая представление каждого контроллера назад на контроллер, и сообщения диспетчеризируются на основе той ссылки.)

<час>

Обновление: Это было действительно частным волшебством в 2009, когда я сначала записал этот ответ, но последующие изменения iOS сделали API позади него общественностью. Корневой контроллер представления теперь доступен через UIWindow.rootViewController свойство, и дерево порожденных контроллеров представления формируется с помощью UIViewController.childViewControllers свойство.

контроллеры представления Parent ответственны за уведомление их детей изменений ориентации. (Я не уверен, как корневой контроллер представления уведомляется, но Вы могли установить точку останова и узнать себя.) -shouldAutomaticallyForwardRotationMethods метод решает, сделает ли UIViewController это для Вас. Если это возвращается NO, Вы становитесь ответственными за то, что сделали так в Вашем -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:, и -didRotateFromInterfaceOrientation: методы.

4
ответ дан 30 November 2019 в 13:34
поделиться

Как он узнает, какой UIViewController имеет представление как подпредставление окна?

Класс UIViewController поддерживает статическую карту между представлениями и их контроллерами представлений. Эта карта запрашивается в нескольких ключевых местах внутри CocoaTouch. В частности, [UIView nextResponder] запрашивает его и возвращает контроллер, если он найден.

Я предполагаю, что UIWindow выполняет тот же поиск со своим корневым представлением, чтобы узнать, на какой контроллер направлять события вращения. Проверю в следующий раз буду искать что-нибудь при разборке. (Я'

4
ответ дан 30 November 2019 в 13:34
поделиться

У меня похожая проблема.

У меня игра работает в альбомной ориентации (как слева, так и справа).

Для управления многовидовым приложением я использую корневой UIviewController, то есть фиктивный UIViewcontroller с UIview, который ничего не делает. Затем я добавляю к нему все остальные UIview как subview.

При запуске приложения эмулятор быстро переходит в портретную ориентацию, и я получаю каждое из моих представлений с его свойством фрейма, которое выглядит как (0, -80,320,480). Это приводит к тому, что вид обрезается прямоугольником 160 X 320 с правой стороны.

Я заметил, что метод - shouldAutorotateToInterfaceOrientation: каждого подпредставления вызывается только один раз, и это происходит, когда он добавляется к корневому представлению. Позже, при повороте устройства, только в корневом представлении вызывается его метод.

Неудивительно, что любой из вызовов методов - willAnimate * отправляется только в корневое представление, поэтому определение любого из этих методов в подпредставлениях бессмысленно.

Эти методы вызываются каждый раз, когда ориентация изменяется на ориентацию, принятую методом - shouldAutorotateToInterfaceOrientation :. поэтому я решил, что могу изменить свойство frame моего subviews оттуда.

Для этого я определил в своем классе rootViewController следующий метод:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    subview1_ViewController.view.frame = CGRectMake(0,0,480,320);
    subview2_ViewController.view.frame = CGRectMake(0,0,480,320);
        ...
}

Я не понимаю, почему свойство frame не обновляется, но я знаю, что это обходное решение работает.

Надеюсь, это поможет ....

1
ответ дан 30 November 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: