prepareForSegue没有被调用,当我点击一个button,而不使用performSegueWithIdentifier

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

我注意到,虽然我的模态视图控制器来了,它不会在此之前调用prepareForSegue。 我search了斯坦福大学的项目,看看在prepareForSegue被调用之前他们可能会注册什么样的行为,但是没有证据。 任何人都可以在这方面做点什么。 我search堆栈溢出,我发现所有用户都失踪了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; } } 

这是一个故事板的例子: 在这里输入图像说明

这是我的故事板的一个例子: 在这里输入图像说明

在debugging器中,当我在Stanford Demo代码中停止时,调用堆栈显示故事板正在执行一个segue动作,在故事板中需要configuration什么来实现相同的结果? 在这里输入图像说明

那么,事实certificate,我的视图控制器button调用模态视图没有正确的类prepareForSegue实施。 这是默认的UIViewController,而不是我的自定义类。

我想出来的方法是在viewDidLoad中放置一个断点,即使这样也没有中断,因此我怀疑在故事板中没有与实现该button的视图相关的正确类。

当为表格视图挂钩自动search时,除了Amro的答案(不分配相应的子类)之外,还有另外两种情况, prepareForSegue可能不会被调用。 确保你已经:

  1. 从表视图原型单元, 而不是表视图控制器挂钩segue。

  2. 在segue connectionpopup式菜单的“Selection Segue”组中使用了一个segue,在“Accessory Action”下没有一个。

挂起自动塞格

[点击图片放大]

总是会调用它的Modal还是Push Segue

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

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

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

你必须更新到Swift 3的“准备”function为它的工作segues:

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

我有一个与UICollectionViewCell类似的问题作为segue的来源。
看起来,故事板segue工作(没有performSegueWithIdentifier )它需要你有一个UICollectionViewCell的自定义子类,并使用它作为故事板上的CollectionViewCellClass

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

我有一个类似的问题。

思考过程是:

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

在我的情况下,它发生,因为我的控制器正在扩展另一个控制器(尤里卡窗体视图控制器= FormViewController)女巫已执行performSeguefunction是这样的:

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

我的function是这样实现的:

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

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

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

瞧!

就我而言,我的项目中有几个视图控制器的基类。 这个基类有一个prepareForSegue()的实现,这个实现在任何情况下都没有被调用。 问题是,在我的一个视图控制器从基类inheritance,并重写prepareForSegue()实现,我忘了调用super.prepareForSegue()

首先,你必须select你的button+ CTRL拖动项目给你查看控制器selectselect赛格。后,你必须正确命名赛格标识符。

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

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