【问题标题】:Presenting view controller's viewDidLoad getting called after presented view controller dismissed呈现视图控制器的 viewDidLoad 在呈现的视图控制器关闭后被调用
【发布时间】:2017-04-07 10:23:19
【问题描述】:

我有一个视图控制器,它可以像这样呈现另一个视图控制器

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

【问题讨论】:

  • 正确检查可能是你有一些其他地方也为 self.present 编码。
  • viewDidLoad 不应该被再次调用,也许你重复了viewWillAppear 中的代码?
  • @jjatie 我没有定义 viewWillAppear?控制器包含在选项卡中,这可能是为什么?
  • 故事板中是否设置了QRScannerViewController
  • @Idan这里的问题是如何防止每次出现初始VC时都调用代码。

标签: ios swift viewdidload presentviewcontroller


【解决方案1】:

好的,这里的问题是 ARC 完成了它的工作。

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

解决方案:

有几种解决方案:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    相关资源
    最近更新 更多