Prepare 不会在 segue 上被调用(Swift 4.2)
Prepare doesn't get called on segue (Swift 4.2)
我在这里搜索了答案,但没有找到与我完全相同的问题,请帮我解决一下。
问题是,当我创建一个单独的视图并尝试使用故事板和导航视图控制器进行转场时,转场本身工作正常,但是
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
没有接到电话。为了让我的示例尽可能简单,我制作了一个玩具应用程序来展示正在发生的事情。
That's how the overall storyboard schema looks like. ViewController is embedded in NavigationController.
Segue is made with ctrl + SecondViewController, identifier is set.
Custom class for SecondViewController is set.
视图控制器具有以下实现:
主视图控制器设置唯一按钮的标题:
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
。
Here is a gif showing how the app works. 如您所见,第二个视图上的标签也没有更新。
我也试过设置 segue this way,然后创建一个 @IBAction
函数并手动调用 performSegue
:
@IBAction func onButton(_ sender: UIButton) {
performSegue(withIdentifier: "Id", sender: self)
}
请帮助我理解和解决问题。谢谢。
好的,我知道出了什么问题。对于那些仍然对 IOS 中转场的工作方式感到困惑的人,请查看下图:
Segues in IOS (taken from here)
请注意 prepare (for: sender)
位于视图 A 中 ,而不是视图 B。这很关键,因为它在执行实际的 segue 之前被触发。此外,如果您将一些值分配给 View B 参数(例如 UIIMageView
),则视图会根据这些更改呈现。
我在这里搜索了答案,但没有找到与我完全相同的问题,请帮我解决一下。
问题是,当我创建一个单独的视图并尝试使用故事板和导航视图控制器进行转场时,转场本身工作正常,但是
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
没有接到电话。为了让我的示例尽可能简单,我制作了一个玩具应用程序来展示正在发生的事情。
That's how the overall storyboard schema looks like. ViewController is embedded in NavigationController.
Segue is made with ctrl + SecondViewController, identifier is set.
Custom class for SecondViewController is set.
视图控制器具有以下实现:
主视图控制器设置唯一按钮的标题:
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
。
Here is a gif showing how the app works. 如您所见,第二个视图上的标签也没有更新。
我也试过设置 segue this way,然后创建一个 @IBAction
函数并手动调用 performSegue
:
@IBAction func onButton(_ sender: UIButton) {
performSegue(withIdentifier: "Id", sender: self)
}
请帮助我理解和解决问题。谢谢。
好的,我知道出了什么问题。对于那些仍然对 IOS 中转场的工作方式感到困惑的人,请查看下图:
Segues in IOS (taken from here)
请注意 prepare (for: sender)
位于视图 A 中 ,而不是视图 B。这很关键,因为它在执行实际的 segue 之前被触发。此外,如果您将一些值分配给 View B 参数(例如 UIIMageView
),则视图会根据这些更改呈现。