准备不会在 segue 上被调用 (Swift 4.2)



我在这里搜索了答案,但找不到与我完全相同的问题,请帮我解决。

问题是,当我创建一个单独的视图,并尝试使用故事板和导航视图控制器制作一个片段时,片段本身工作得很好,但

override func prepare(for segue: UIStoryboardSegue, sender: Any?)

没有接到电话。为了尽可能减少我的例子,我制作了一个玩具应用程序来显示正在发生的事情

这就是整个故事板模式的样子ViewController嵌入在

NavigationControllerSegue是用ctrl+SecondViewController制作的,标识符设置

SecondViewController的自定义类已设置

视图控制器有以下实现:
主视图控制器设置唯一按钮的标题:

class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
button.setTitle("Awesome title", for: .normal)
}
}

按下按钮后,标签将从按钮的标题更新:

class SecondViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
print("SecondViewController viewDidLoad method")
}
// MARK: - Navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
print(print("SecondViewController prepare method"))
if let text = (sender as? UIButton)?.titleLabel?.text {
label.text = text
}
}
}

我特意放了两个print语句,以显示实际上调用了viewDidLoad,但没有调用prepare

这是一张显示应用程序工作原理的gif图。正如您可能看到的,第二个视图上的标签也没有更新。

我也尝试过用这种方式设置segue,然后创建一个@IBAction函数并手动调用performSegue:

@IBAction func onButton(_ sender: UIButton) {
performSegue(withIdentifier: "Id", sender: self)
}

请帮我理解并解决这个问题。非常感谢。

好的,我发现了问题所在。对于那些仍然对segues在IOS中的工作方式感到困惑的人,请看下图:

IOS中的分段(取自此处)

请注意,prepare (for: sender)位于视图A中,而不是视图B中。这是至关重要的,因为它是在实际segue执行之前触发的。此外,如果为View B参数指定一些值(例如UIIMageView),则视图将在考虑这些更改的情况下进行渲染。

相关内容

  • 没有找到相关文章

最新更新