为什么我的segue没有被执行?

时间:2014-05-29 21:27:53

标签: ios objective-c uistoryboardsegue

我有一个segue应该在许多事情发生时发生,所以它以编程方式调用,如下所示:

- (void)unwindAway
{
    NSLog(@"Let's segue");
    [self performSegueWithIdentifier:@"mySegue" sender:self];
    NSLog(@"We should have just performed the segue");
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@"Let's do a segue");
}

但我在控制台中得到的输出是:

2014-05-29 22:20:30.173 My App[7848:60b] Let's segue
2014-05-29 22:20:30.178 My App[7848:60b] We should have just performed the segue

所以你可以看到,它甚至没有调用prepareForSegue。

segue名称是正确的 - 如果我给出一个无效的segue名称,那么它就会出现错误。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

对于展开segue,在作为segue源的视图控制器上调用prepareForSegue:sender:,换句话说就是你要退出的那个。

答案 1 :(得分:0)

根据Rob在评论中的建议,我在segue中检查了目标View Controller中方法的名称。它看起来是正确的(并且在IB中选择而不是键入)但是粘贴它并重新编译修复了问题。必须在故事板的源代码中搞砸一些东西,这可能是重命名方法的人工制品。

值得注意的是,如果任何人都有类似的问题,如果找不到segue的目标方法,那么应用程序不会产生任何错误(我已通过输入无意义的方法名称确认了这一点)。

答案 2 :(得分:0)

我知道您的问题已得到修复,但为了将来参考,我只想说类似的问题可能是由于展开过程的工作原理(参见上面的技术说明链接)。

只要在某个视图控制器中触发了segue,就会调用其父(!)视图控制器并显示消息:viewControllerForUnwindSegueAction:fromViewController:withSender:。实现检查父级是否要处理展开操作。如果没有,则搜索具有子视图控制器的数组以寻找想要处理该动作的视图控制器。

我的问题是展开动作是在嵌入导航控制器的视图控制器的子视图控制器中实现的。因此,当te segue开始时,导航控制器(父母)被问到:你会处理这个动作吗?它返回NO。然后,它的孩子被问到同样的问题。它返回NO。由于消息未发送到父视图控制器的子视图的子视图控制器,因此没有视图控制器将处理展开操作,并且它将在没有错误消息的情况下中止。

我的解决方案是在视图控制器本身而不是在它的子视图控制器中实现展开动作。

相关问题