我有一个视图控制器,它提供了另一个视图控制器,如此
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
答案 0 :(得分:1)
好的,这里的问题是ARC正在做它的工作。
当呈现视图控制器呈现另一个视图控制器时,ARC正在卸载呈现控制器。这意味着当呈现的视图控制器被解除时,呈现的视图控制器被重新实例化,因此强制viewDidLoad方法再次被调用
解决方案:
有几种解决方案可供选择:
首先,我只是在一个帮助器中存储了一个标志,我可以在viewDidLoad方法中检查它是否已经加载过,如果它已经加载,不再显示视图控制器
或者,我更改为扫描了一个qr代码后,在所呈现的视图控制器委托(呈现控制器)中调用导航到我想要的视图的函数,从而跳过再次执行viewDidLoad的问题。