Правильное время для вызова viewDidAppear вручную?

У меня есть UITableViewController в моем приложении, которое добавляется в иерархию представлений напрямую. После появления представления я хочу перейти к определенной ячейке. Мое решение было бы вызвать код для прокрутки в -[viewDidAppear],

Согласно документации Apple, я должен вызвать метод вручную:

Если представление, принадлежащее контроллеру представления, добавляется непосредственно в иерархию представления, контроллер представления не получит это сообщение. Если вы вставляете или добавляете представление в иерархию представлений, и у него есть контроллер представлений, вам следует отправить это сообщение соответствующему контроллеру представлений напрямую.

Вопрос в том, когда подходящее время, чтобы вызвать его вручную?

Вызов его из родительского контроллера представления -[viewDidAppear] приводит к падению, когда я пытаюсь выполнить прокрутку, потому что, по-видимому, табличное представление на самом деле еще не появилось и, следовательно, думает, что в нем нет разделов для прокрутки.

4 ответа

Решение

Вызывать его из -viewDidAppear родительского контроллера обычно - ваш лучший выбор.

Если это приводит к проблемам, если дочерний контроллер представления еще не полностью инициализирован, у вас может быть другая проблема. Убедитесь, что ваш дочерний контроллер представления полностью "готов к действию" после вызова -viewWillAppear (который вы также можете вызвать вручную из родительского -viewWillAppear)

Если вы используете просмотр контроллера, не звоните viewWillAppear: непосредственно. Вместо этого используйте – beginAppearanceTransition:animated: а также – endAppearanceTransition,

Если вы реализуете пользовательский контроллер контейнера, используйте этот метод, чтобы сообщить дочернему элементу о том, что его представления должны появиться или исчезнуть. Не вызывайте viewWillAppear:, viewWillDisappear:, viewDidAppear: или viewDidDisappear: напрямую.

Вызов addSubView автоматически сработает viewWillAppear: а также viewDidAppear: если viewController представления является дочерним контроллером представления, поэтому вызывая viewWillAppear: напрямую вызовет вид, появится метод появления дважды. Использование beginAppearanceTransition:animated: and - endAppearanceTransition` отключит автоматическое поведение, поэтому вы вызываете его только один раз.

В -[viewDidAppear] для табличного представления, действительно вызываемого из родительского контроллера представления -[viewDidAppear], вы можете вызвать [tableView reloadData], таким образом вы гарантируете, что tableView загружен и готов.

Это как я вручную звоню viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear здесь

и один из контроллеров представления, которые я загружаю таким образом, имеет следующее viewWillAppear: (обратите внимание, что это viewWillAppear так как в тот момент, что viewDidAppear называется, ваш вид виден пользователю)

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [wordListTable reloadData];
    [wordListTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
}
Другие вопросы по тегам