Правильное время для вызова viewDidAppear вручную? - PullRequest
6 голосов
/ 22 сентября 2009

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

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 30 июля 2014

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

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

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

1 голос
/ 22 сентября 2009

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

1 голос
/ 22 сентября 2009

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

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

0 голосов
/ 23 сентября 2009

Вот как я вручную звоню 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...