У меня создалось впечатление, что viewDidLoad будет называться ПОСЛЕ завершения подготовкиForSegue. Это даже то, как Гегарти преподает свой класс Стэнфорда (совсем недавно, в феврале 2013 года).
Однако в первый раз сегодня я заметил, что viewDidLoad был вызван до того, как завершилась подготовкаForSegue. Поэтому свойства, которые я устанавливал в prepareForSegue, недоступны для целевогоViewController в методе viewDidLoad для адресатов.
Это противоречит ожидаемому поведению.
UPDATE
Я только что понял, что происходит. В моем destinationViewController у меня был настраиваемый сеттер, который будет перезагружать tableView каждый раз, когда обновляется "модель":
DestinationViewController
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
[self.tableView reloadData];
}
Оказывается, поскольку destinationViewController является подклассом UITableViewController... вызов self.tableView заставляет загрузку представления. Согласно документации Apple, вызов свойства view контроллера вида может заставить просмотр загружаться. Представление UITableViewController - это tableView.
Следовательно, в prepareForSegue следующая строка заставляла загружать представление destinationViewController:
vc.managedObjectsArray = <custom method that returns an array>;
Чтобы устранить проблему, я изменил пользовательский установщик модели destinationViewController на:
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
if ([self isViewLoaded]) {
[self.tableView reloadData];
}
}
Это только перезагружает tableView, если tableView находится на экране. Таким образом, не заставляя просмотр загружаться во время подготовки к работе.
Если кто-то возражает против этого процесса, поделитесь своими мыслями. В противном случае я надеюсь, что это предотвратит долгую бессонную ночь для кого-то.