我在这里搜索了答案,但找不到与我完全相同的问题,请帮我解决。
问题是,当我创建一个单独的视图,并尝试使用故事板和导航视图控制器制作一个片段时,片段本身工作得很好,但
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
没有接到电话。为了尽可能减少我的例子,我制作了一个玩具应用程序来显示正在发生的事情
这就是整个故事板模式的样子ViewController嵌入在 NavigationControllerSegue是用ctrl+SecondViewController制作的,标识符设置。 SecondViewController的自定义类已设置。 视图控制器有以下实现: 按下按钮后,标签将从按钮的标题更新: 我特意放了两个print语句,以显示实际上调用了 这是一张显示应用程序工作原理的gif图。正如您可能看到的,第二个视图上的标签也没有更新。 我也尝试过用这种方式设置segue,然后创建一个 请帮我理解并解决这个问题。非常感谢。
主视图控制器设置唯一按钮的标题: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
}
}
}
viewDidLoad
,但没有调用prepare
。@IBAction
函数并手动调用performSegue
:@IBAction func onButton(_ sender: UIButton) {
performSegue(withIdentifier: "Id", sender: self)
}
好的,我发现了问题所在。对于那些仍然对segues在IOS中的工作方式感到困惑的人,请看下图:
IOS中的分段(取自此处)
请注意,prepare (for: sender)
位于视图A中,而不是视图B中。这是至关重要的,因为它是在实际segue执行之前触发的。此外,如果为View B参数指定一些值(例如UIIMageView
),则视图将在考虑这些更改的情况下进行渲染。