Правильное время для вызова 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];
}