呈现一个新的视图控制器然后关闭它,调用父视图控制器上的 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呢?
【问题讨论】:
在HomeViewController
的init
中放置一个断点,看看是什么调用它。
@rmaddy OMG 你是最棒的,非常感谢你让我第 10 次在这个断点处寻找。我终于看到了这个问题,我正在 viewWillAppear 的 Tabbarviewcontroller 中创建视图控制器!该死的!非常感谢:)
【参考方案1】:
感谢@rmaddy,我找到了问题。
为了找出答案,我在一直被调用的init()
函数中放置了一个断点。我发现在TabbarViewController
中调用它的人是viewWillAppear()
。
问题是我在 viewWillAppear()
而不是 viewDidLoad()
上初始化了标签栏视图控制器,这使得每次出现一个视图时都重新创建所有标签控制器。
【讨论】:
以上是关于呈现一个新的视图控制器然后关闭它,调用父视图控制器上的 init()的主要内容,如果未能解决你的问题,请参考以下文章