viewDidLoad вызывается до завершения prepareForSegue
У меня сложилось впечатление, что viewDidLoad будет называться ПОСЛЕ ПОДГОТОВКИ ПОДГОТОВКИ ФОТОГРАФИИ Это то, как Хегарти преподает в своем классе в Стэнфорде (совсем недавно, в феврале 2013 года)
Однако сегодня я впервые заметил, что viewDidLoad назывался ДО того, как prepareForSegue было закончено. Поэтому свойства, которые я устанавливал в prepareForSegue, не были доступны для destinationViewController в методе destinationDidLoad.
Это противоречит ожидаемому поведению.
ОБНОВИТЬ
Я просто понял, что происходит. В моем 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 = ;
Чтобы исправить проблему, я изменил пользовательский установщик destinationViewController 'с моделью для:
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
if ([self isViewLoaded]) {
[self.tableView reloadData];
}
}
Это перезагрузит tableView, только если tableView находится на экране. Таким образом, не заставляя представление загружаться во время prepareForSegue.
Если кто-то возражает против этого процесса, пожалуйста, поделитесь своими мыслями. В противном случае, я надеюсь, что это предотвратит долгую бессонную ночь для кого-то.