【问题标题】:Swift viewWillAppear not being called after dismissing view controller关闭视图控制器后未调用 Swift viewWillAppear
【发布时间】:2018-12-07 21:36:44
【问题描述】:

我正在从一个名为 HomeController 的视图控制器中展示一个视图控制器,如下所示:

let viewController = self.storyboard?.instantiateViewController(withIdentifier: "LoginController") as! LoginController

let navigationController: UINavigationController = UINavigationController(rootViewController: viewController)

present(navigationController, animated: true, completion: nil)

在呈现的视图控制器中,LoginController 有时会被解除:

self.dismiss(animated: true, completion: nil)

但是当它返回到 HomeController 时它并没有调用 viewWillAppear,当它返回到它时我确实需要检查 HomeController 上的条件,那么当 LoginController 关闭视图时如何调用 viewWillAppear?

【问题讨论】:

  • 控制器上的显示类型是什么?
  • 我应该在哪里设置或找出什么类型?这只是一个普通的旧礼物电话
  • 如果演示不是全屏或自定义动画,则不会在底层控制器上调用外观方法。

标签: ios swift


【解决方案1】:

将显示样式更改为 .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)
      }
 }

【讨论】:

    【解决方案2】:

    在 iOS 13 中,如果您正在呈现视图控制器并且当您回来时 viewWillAppear 不会被调用。 我已将它从现在更改为推送视图控制器,并且现在正在调用方法。

    【讨论】:

    • 嗨,你能分享更多细节吗?你在哪里改的?
    • 当您从 VC1 导航到 VC2 时,您必须编写当前视图控制器。只需将其更改为推送
    • 另一种方法是更改​​演示样式。:vc.modalPresentationStyle = UIModalPresentationFullScreen;
    • 我想我理解你,但是没有推送方法,我需要在 UIViewController 之外使用其他协议吗?
    • 我刚刚完成,但设置 .fullscreen 不起作用,viewwillapear 没有调用
    【解决方案3】:

    您需要设置正确的presentationStyle。如果您希望您的presentedController 将是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)
    

    【讨论】:

    • 我试过这个 viewWillAppear 在关闭 LoginController 时没有被调用
    • @user979331 对不起,我的坏是 .fullScreen
    • 您可以单击情节提要中的 segue 并在属性检查器下,将演示文稿更改为全屏。对我来说,这比写代码更容易。
    • 我知道这是一个老问题,但仍然与保持新鲜有关。我有一个问题,不是我所有的 segues 都是全屏模式演示。这让我发疯,但这是有道理的。所有以模态方式呈现的视图控制器都必须是全屏的,否则根本不会调用视图。即使你错过了一个,最后一个视图当被解除到根时,不会调用视图会出现。
    • 如果使用 "PresentationStyle = .overCurrentContext" 有没有办法在关闭 viewController 后调用 willAppear ?因为我需要透明模型视图所以不能使用 modalPresentationStyle = .fullScreen.
    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2021-06-17
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多