performSegueWithIdentifier之后prepareForSegue没有被调用

4

我刚开始接触iOS开发。有很多重复的问题(抱歉),但我无法解决这个问题。

在调用performSegueWithIdentifier之后,prepareForSegue没有被调用。

展示segue标识符命名为'segue1'。从ViewController向DetailViewController拖动了Ctrl-Dragged。

我错过了什么吗?

ViewController.swift:

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func buttonTapped(sender: AnyObject) {
    print("ViewController - buttonTapped()")
    performSegueWithIdentifier("segue1", sender: self)
}

override func performSegueWithIdentifier(identifier: String, sender: AnyObject?) {
    print("ViewController - performSegueWithIdentifier(): \(identifier)")
}

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool {
    print("ViewController - shouldPerformSegueWithIdentifier()")
    return true
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    print("ViewController - prepareForSegue(): \(segue.identifier!)")
}
}

DetailViewController.swift:

class DetailViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    print("DetailViewController - viewDidLoad()")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
}

这里是一个故事板的截图

输出(在按钮被点击后)

ViewController - buttonTapped()
ViewController - performSegueWithIdentifier(): segue1
1个回答

6
您没有调用super - 添加以下内容以将消息发送到父类(这将依次触发segue)。
super.performSegueWithIdentifier(identifier, sender: sender)

天才!非常感谢你。 - ijmo
嗨 Oliver,我知道你在近一年前回答了这个问题,但如果可能的话,你能否解释一下为什么需要调用super.performSegueWithIdentifier吗?再次感谢你的帮助! - Thor
1
@TonyStark 我只能猜测,但如果你查看 UIViewController 的二进制文件,该函数不是空的,因此它将委托工作并在提交和执行之前可能调用 prepareForSegue。 - Oliver Atkinson
@TonyStark Apple在UIKit的基类中做了很多工作。通常情况下,您也希望调用super viewDidLoad、viewDidAppear等方法。 - quantumpotato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接