呈现视图控制器的viewDidLoad在呈现的视图控制器被解除后被调用

时间:2016-11-23 11:59:06

标签: ios swift viewdidload presentviewcontroller

我有一个视图控制器,它提供了另一个视图控制器,如此

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = .white

   let qrScannerViewController = QRScannerViewController()
   qrScannerViewController.presentedBy = self
   self.present(qrScannerViewController, animated:true, completion: nil)

    // Do any additional setup after loading the view.
}

qrScannerViewController(呈现的视图控制器)然后调用

self.dismiss(animated:true, completion: nil)
根据我的理解,

无论如何都要求呈现视图控制器解除功能。

问题是,一旦呈现的视图控制器被解除,呈现视图控制器的viewDidLoad将再次被调用,这意味着视图控制器会再次出现。

任何想法如何解决这个问题?

即使我使用委托,也会再次调用呈现视图控制器的viewDidLoad

由于

呈现视图控制器在UITabController中定义:

let qrPlaceholderViewController = QRPlaceholderViewController()
let controllers = [restaurantNavController,favouritesViewController, qrPlaceholderViewController, profileViewController]
self.viewControllers = controllers

1 个答案:

答案 0 :(得分:1)

好的,这里的问题是ARC正在做它的工作。

当呈现视图控制器呈现另一个视图控制器时,ARC正在卸载呈现控制器。这意味着当呈现的视图控制器被解除时,呈现的视图控制器被重新实例化,因此强制viewDidLoad方法再次被调用

解决方案:

有几种解决方案可供选择:

首先,我只是在一个帮助器中存储了一个标志,我可以在viewDidLoad方法中检查它是否已经加载过,如果它已经加载,不再显示视图控制器

或者,我更改为扫描了一个qr代码后,在所呈现的视图控制器委托(呈现控制器)中调用导航到我想要的视图的函数,从而跳过再次执行viewDidLoad的问题。

相关问题