我从一个名为HomeController的视图控制器中呈现一个视图控制器,如下所示:
let viewController = self.storyboard?.instantiateViewController(withIdentifier: "LoginController") as! LoginController
let navigationController: UINavigationController = UINavigationController(rootViewController: viewController)
present(navigationController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
在提出的视图控制器中,LoginController有时会被关闭:
self.dismiss(animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
但是,当返回到HomeController时,它不是在调用viewWillAppear,我真的需要在返回时检查HomeController上的条件,因此,当LoginController取消视图时,如何调用viewWillAppear?
小智 17
如果呈现的 viewController 是半屏,那么您将必须在侧面呈现的视图控制器的 viewWillDisappear 中手动调用呈现 viewController 的 viewWillAppear 。将以下代码添加到您的演示视图控制器中。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
presentingViewController?.viewWillDisappear(true)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
presentingViewController?.viewWillAppear(true)
}
Run Code Online (Sandbox Code Playgroud)
注意:您必须调用“presentingViewController?.viewWillDisappear(true)”才能让您的演示视图控制器viewWillAppear每次执行。
您需要设置正确的presentationStyle。如果您希望presentatedController将是fullScreen并将其命名为以前的viewWillAppear,则可以使用“ .fullScreen ”
let viewController = self.storyboard?.instantiateViewController(withIdentifier: "LoginController") as! LoginController
let navigationController: UINavigationController = UINavigationController(rootViewController: viewController)
navigationController.modalPresentationStyle = .fullScreen
present(navigationController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
小智 9
将呈现样式更改为 .fullScreen 可以工作,但会更改呈现的视图控制器的外观。如果你想避免这种情况,你可以重写所呈现的视图控制器中的 viewWillDisappear 方法并在其中添加presentingViewController?.viewWillAppear(true).
例子:
class ViewControllerA: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//put the presenting action wherever you want
let vc = ViewControllerB()
navigationController.present(vc, animated: true)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//refresh Whatever
}
}
class ViewControllerB: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
//this will call the viewWillAppear method from ViewControllerA
presentingViewController?.viewWillAppear(true)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4002 次 |
| 最近记录: |