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

时间:2014-02-07 04:05:57

标签: ios iphone objective-c 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;
    }

}

以下是故事板的示例: enter image description here

以下是我的故事板示例: enter image description here

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

10 个答案:

答案 0 :(得分:30)

嗯,事实证明,我的视图控制器按钮调用模态视图没有正确的类,其中实现了prepareForSegue。这是默认的UIViewController,而不是我的自定义类。

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

答案 1 :(得分:10)

当连接表格视图的自动segue时,除了Amro的答案(不指定相应的子类)之外,还有另外两种可能不会调用prepareForSegue的情况。确保您:

  1. 将表视图原型单元格中的segue连接起来,表视图控制器。

  2. 在" Selection Segue"下使用了一个segue。在segue连接弹出菜单中的下的一个组"附件操作"。

  3. Hooking up automatic segues

    [点击图片放大]

答案 2 :(得分:10)

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

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // code
}

您必须更新到Swift 3"准备"它的功能是为segues工作:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // code
}

答案 3 :(得分:5)

代码下面的Modal或Push Segue是否总是被称为

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

答案 4 :(得分:2)

在我的情况下,它因为我的控制器正在扩展另一个控制器(Eureka Form View Controller = FormViewController)而实现了如下所示的performSegue函数:

open override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // code
}

我的功能是这样实现的:

func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // code
}

为了解决这个问题,我在之前添加了覆盖:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // code
}

瞧!

答案 5 :(得分:1)

我有UICollectionViewCell作为segue来源的类似问题 似乎故事板segue工作(没有performSegueWithIdentifier),你需要有UICollectionViewCell的自定义子类,并将其用作Class的{​​{1}}故事板。

答案 6 :(得分:1)

就我而言,我没有在包含segue的视图控制器的故事板中将该模块设置在类的名称下。它被设置为none,一旦我点击模块字段,它就会设置为正确的项目/模块,并解决了问题。

答案 7 :(得分:1)

我有类似的问题。

思考过程是:

  1. 确保您拥有正确的方法签名。它已在Swift 3中发生了变化。
  2. 然后确保你连接按钮的方式(或任何触发segue的方式)与你在故事板中连接segue的方式相匹配。有时你会拨打一个按钮,但没有正确地将segue从该按钮连接到目标视图控制器。
  3. 确保segue的标识符正确无误。虽然这不是prepareForSegue没有被调用的原因,但这只是没有调用特定segue的原因。

答案 8 :(得分:0)

就我而言,我的项目中有几个视图控制器的基类。该基类具有prepareForSegue()的实现,在每种情况下都没有被调用。问题是我的一个视图控制器继承自基类并覆盖了它的prepareForSegue()实现,我忘了打电话给super.prepareForSegue()

答案 9 :(得分:-1)

首先你必须选择按钮+ ctrl拖动项目来查看控制器选择segue。后来,你必须正确命名segue标识符。

不要将一个视图控制器连接到其他视图控制器。 为此导入UIKit.framework 然后这个方法就会被调用。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"identifierName"])
    {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        ExampleViewController *destViewController = segue.destinationViewController;
    }
}