当我在不使用performSegueWithIdentifier的情况下单击按钮时,不会调用prepareForSegue

Amr*_*nes 26 iphone objective-c ios segue uistoryboardsegue

基于斯坦福iOS课程,我正在使用模态视图控制器.在演示中,他们有一个按钮可以启动模态视图,当它被点击时,函数prepareForSegue被调用.我将代码和实现模仿到我的项目中,唯一的区别是我的演示是在iPhone故事板上,而他们的是在iPad上.

我注意到,当我的模态视图控制器出现时,它在此之前不会调用prepareForSegue.在查看prepareForSegue之前,我搜索了斯坦福项目,看看他们可以在哪里注册任何segue行为,但是没有证据.任何人都可以对此有所了解.我搜索了堆栈溢出,我发现所有用户都缺少performSegueWithIdentifier的调用实现.然而,在斯坦福大学的演示中他们从未这样做过.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier hasPrefix:@"Create Label"]) {
        AskerViewController *asker = (AskerViewController *)segue.destinationViewController;
        asker.question = @"What do you want your label to say?";
        asker.answer = @"Label Text";
        asker.delegate = self;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是故事板的一个例子: 在此输入图像描述

这是我的故事板的一个例子: 在此输入图像描述

在调试器中,当我停在斯坦福演示代码中时,调用堆栈显示故事板正在执行segue操作,我需要在故事板中配置什么才能获得相同的结果? 在此输入图像描述

Amr*_*nes 32

好吧,事实证明,我的视图控制器按钮调用模态视图没有实现prepareForSegue的正确类.它是默认的UIViewController,而不是我的自定义类.

我想出来的方法是在viewDidLoad中设置一个断点,即使这没有破坏,因此我怀疑在故事板中我没有与实现按钮的视图相关联的正确类.

  • 做得好.你学到了很重要的东西!这是一个容易犯的错误,你会再多做几次.:)))) (12认同)

Man*_* BM 12

对于有这个问题的其他人,如果你现在使用的Swift 3具有以下功能将不会抛出错误,因为它是正确的语法但它不起作用,因为它是Swift 2函数:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // code
}
Run Code Online (Sandbox Code Playgroud)

您必须更新到Swift 3"准备"功能才能使其适用于segues:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // code
}
Run Code Online (Sandbox Code Playgroud)


Don*_*ghn 11

当连接表视图的自动segue时,除了Amro的答案(不分配相应的子类)之外,还有另外两个prepareForSegue可能未被调用的情况.确保你:

  1. 从表视图原型单元,而不是表视图控制器连接segue .

  2. 在segue连接弹出菜单中的"Selection Segue"组下使用了一个segue,而不是 "辅助操作"下的一个.

连接自动segues

[点击图片放大]


bha*_*ari 5

无论是代码下面的Modal还是Push Segue,都会被调用

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"Create Label"]) {
        SignUpViewController *asker = segue.destinationViewController;
    }
}
Run Code Online (Sandbox Code Playgroud)