关闭视图控制器后未调用Swift viewWillAppear

use*_*331 6 ios swift

我从一个名为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每次执行。


Kev*_*rio 9

您需要设置正确的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)

  • 您可以单击情节提要中的转场,然后在属性检查器下将演示文稿更改为全屏。对我来说,这比编写代码更容易。 (2认同)

小智 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)