呈现视图控制器的viewDidLoad获得所谓的介绍后视图控制器驳回

问题描述:

我有呈现像这样呈现视图控制器的viewDidLoad获得所谓的介绍后视图控制器驳回

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

检查正确可能是你有一些其他地方代码self.present。 –

+0

'viewDidLoad'不应该再次被调用,也许你已经重复'viewWillAppear'中的代码? – jjatie

+0

@jjatie我没有viewWillAppear定义?控制器是包含在一个选项卡内,可能这是为什么? – mwild

好了,所以这里的问题是ARC做好自己的工作。

当呈现视图控制器呈现其他视图控制器时,ARC正在卸载呈现控制器。这意味着,当呈现视图控制器被驳回,则呈现一个被重新实例,从而迫使viewDidLoad方法来再次调用

解决方案:

几个解决方案可供选择:

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

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