【发布时间】:2012-06-02 00:40:05
【问题描述】:
在我的应用程序中,我使用了故事板和转场,并且我经常在进行转场之前将数据传递给目标视图控制器,如下所示:
- (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;
}
【问题讨论】:
-
destinationViewController 是 UINavigationController 吗?
-
@adambinsz:它是一个嵌入在 UINavigationController 中的 UIViewController。 IB 中的 segue 直接进入 UIViewController。
-
你确定它不会进入导航控制器吗?尝试使用 [[segue.destinationViewController viewControllers] objectAtIndex:0]
-
你的意思是 [[ ( (UIViewController *)segue.destinationViewController).navigationController viewControllers] objectAtIndex:0] 吗?它返回空值。顺便说一句,我认为甚至不可能继续使用 UINavigationController。执行此操作时出现运行时错误。
-
是的,可以使用嵌入 UIViewController 的 UINavigationController 进行 segue。我遇到了类似的问题,并用
[[[segue destinationViewController] viewControllers] objectAtIndex:0]替换了segue.destinationViewController,效果很好。
标签: ios ios5 uiviewcontroller uistoryboardsegue