呈现一个新的视图控制器然后关闭它,调用父视图控制器上的 init()

Posted

技术标签:

【中文标题】呈现一个新的视图控制器然后关闭它,调用父视图控制器上的 init()【英文标题】:Presenting a new view controller and then dismissing it, calls init() on the parent view controller 【发布时间】:2019-09-04 15:02:46 【问题描述】:

我在我的应用程序上发现了一个非常奇怪的行为,视图控制器的结构如下:

TabBarViewController 包含:

- NavigationController(root is HomeViewController)
- NavigationController(root is SearchViewController)
- NavigationController(root is ProfileViewController)

当我在 HomeViewController 中时,我以模态方式呈现 PremiumViewController

@objc func premiumTapped() 
    let premiumViewController = PremiumViewController(viewModel: PremiumViewModel(networkService: NetworkService(), purchasesService: PurchasesService.shared))
    navigationController?.present(premiumViewController, animated: true, completion: nil)

到这里为止都很好。

现在我解雇PremiumViewController.

dismiss(animated: true, completion: nil)

发生的情况是HomeViewController 称它为init()viewDidLoad()

这怎么可能? HomeViewController一直存在,为什么又调用init呢?

【问题讨论】:

HomeViewControllerinit 中放置一个断点,看看是什么调用它。 @rmaddy OMG 你是最棒的,非常感谢你让我第 10 次在这个断点处寻找。我终于看到了这个问题,我正在 viewWillAppear 的 Tabbarviewcontroller 中创建视图控制器!该死的!非常感谢:) 【参考方案1】:

感谢@rmaddy,我找到了问题。

为了找出答案,我在一直被调用的init() 函数中放置了一个断点。我发现在TabbarViewController 中调用它的人是viewWillAppear()

问题是我在 viewWillAppear() 而不是 viewDidLoad() 上初始化了标签栏视图控制器,这使得每次出现一个视图时都重新创建所有标签控制器。

【讨论】:

以上是关于呈现一个新的视图控制器然后关闭它,调用父视图控制器上的 init()的主要内容,如果未能解决你的问题,请参考以下文章

关闭当前的模态视图控制器,然后呈现新的模态视图控制器

在呈现新视图控制器后关闭当前视图控制器 - swift

视图控制器不会立即关闭并呈现新的视图控制器

如何以编程方式弹出一个视图控制器并呈现一个新的

如何关闭模态视图控制器,然后立即让呈现视图控制器呈现不同的模态视图控制器?

移回父视图控制器或关闭子视图控制器