我的印象是 viewDidLoad 将在 prepareForSegue 完成后被调用。这甚至是 Hegarty 教授他的斯坦福课程的方式(最近是 2013 年 2 月)。
然而,今天第一次,我注意到 viewDidLoad 在 prepareForSegue 完成之前被调用了。因此,我在 prepareForSegue 中设置的属性对目标 viewDidLoad 方法中的目标视图控制器不可用。
这似乎与预期的行为相反。
更新
我才弄清楚发生了什么事。在我的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。因此在 prepareForSegue 期间不会强制加载视图。
如果有人反对此过程,请分享您的想法。否则,我希望这可以防止某人度过一个漫长的不眠之夜。