然而,今天我第一次注意到viewDidLoad在prepareForSegue完成之前就被调用了。因此,在prepareForSegue中设置的属性在目标视图控制器内的viewDidLoad方法中是不可用的。
这似乎与预期行为相矛盾。
更新
我刚刚发现了问题所在。在我的目标视图控制器中,我有一个自定义setter,每次“模型”更新时都会重新加载tableView:
DestinationViewController
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
[self.tableView reloadData];
}
原来,由于destinationViewController是UITableViewController的子类...调用'self.tableView'会强制加载视图。根据Apple的文档,调用视图控制器的view属性可以强制加载视图。UITableViewController的视图是tableView。 因此,在prepareForSegue方法中,以下代码强制加载目标视图控制器的视图:
vc.managedObjectsArray = <custom method that returns an array>;
为了解决这个问题,我更改了 destinationViewController 的模型的自定义 setter 为:
- (void)setManagedObjectsArray:(NSArray *)managedObjectsArray
{
_managedObjectsArray = [managedObjectsArray copy];
if ([self isViewLoaded]) {
[self.tableView reloadData];
}
}
只有在tableView在屏幕上时,这才会重新加载tableView。因此不会在prepareForSegue期间强制加载视图。
如果有人反对此过程,请分享您的想法。否则,我希望这能防止某人长时间失眠。
prepareForSegue
实际上是调用viewDidLoad
的函数(直接或间接地)。 - user529758