在我的应用程序中,我使用了故事板和转场,并且我经常在进行转场之前将数据传递给目标视图控制器,如下所示:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)]) {
[segue.destinationViewController performSelector:@selector(setMyData:)
withObject:myData];
}
}
除了在一个地方外,它在任何地方都有效。选择器被调用,数据被设置,但是当 segue 完成并且目标控制器出现时,它没有我刚刚设置的数据。在源视图控制器和目标视图控制器中打印视图控制器的 id 后,我发现segue.destinationViewController
上面代码中的视图控制器实例与显示的实例不同。这里发生了什么?
[更新 1]
我查看了目标视图控制器的生命周期,它首先在 segue 执行期间被加载,但是在我设置属性之后!这意味着,当我调用performSelector
它时,视图控制器对象没有被初始化!这就是我设置的数据不粘的原因。不明白为什么会这样,以及为什么同样的方法适用于我的应用程序的其他部分。
[更新 2]setMyData
按要求
发布代码。起初我根本没有这个方法,因为locationToOpen
是公共财产。我只是添加它以确保它被调用并打印调试信息。
- (void)setMyData:(MyData *)myData
{
DLog(@"self: %@", (id)self);
_myData = myData;
}