一次在viewDidAppear中呈现两个视图控制器
在我的项目中,我基于App本身内的某些条件在viewDidAppear中呈现View Controller(firePromo())。我刚刚完成了将在viewDidAppear中呈现的另一个View Controller(firePromo2())的集成。一次在viewDidAppear中呈现两个视图控制器
这两个视图控制器都可以按照预期运行和显示......但是有可能两个视图控制器在启动时同时被触发。授予 - 概率很低,但仍有机会。
我的代码如下:
func firePromo() {
hasShownPromo = true
// ...
self.present(promoView, animated: true, completion:nil)
}
func firePromo2() {
hasShownPromo2 = true
// ...
self.present(promoView2, animated: true, completion:nil)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if hasShownPromo == false {
if !UserDefaults.standard.bool(forKey: "hasWatchedPromo") {
let promoLaunchCounterFromKey = UserDefaults.standard.integer(forKey: "launchCountForPromoKey")
if promoLaunchCounterFromKey == 4 || promoLaunchCounterFromKey == 9 || promoLaunchCounterFromKey == 14 {
firePromo()
}
}
}
if hasShownPromo2 == false {
if !UserDefaults.standard.bool(forKey: "hasWatchedPromo2") {
let promoLaunchCounterFromKey2 = UserDefaults.standard.integer(forKey: "launchCountForPromoKey2")
if (promoLaunchCounterFromKey2 % 5) == 0 {
firePromo2()
}
}
}
}
我意识到,与上面的代码,它出现是firePromo()& firePromo2()将不会在同一时间(5评价=整除! 4/9/14) - 然而,appDelegate中的promo2还有额外的逻辑。所以两者都有可能评估。
安全地处理这两个视图控制器的呈现,如果两者都会同时触发,最好的方法是什么?
编辑:提前返回的方法。
if promoLaunchCounterFromKey == 4 || promoLaunchCounterFromKey == 9 || promoLaunchCounterFromKey == 14 {
firePromo()
return
}
也在firePromo2()
之后添加回报。只是一个建议;将所有的消防促销代码分离成一个独特的方法,并从viewDidAppear:
中调用该方法。这样,当方法返回时,您不会阻止viewDidAppear:
。
查看我上面发布的针对@dr_barto的回复。 – Joe
我假设你只想要一个宣传片一次展示。我不确定你的意思是“在同一时间”。你的firePromo方法中有没有异步的东西?如果一切都停留在主线上,那么我认为你不应该同时遇到任何事情。 – johncederholm
没有异步,全部在主线程上。通过“在同一时间” - 我只是意味着firePromo方法可能同时评估的机会。因此,应用程序将不得不一次呈现两个VC。我想避免'警告:试图在<_>上显示<_>,其视图不在窗口层次结构中!'在生产中。希望有道理:) – Joe
做一个其他/如果测试,而不是连续的,如果? – Larme
@Larme - 如果我这样做“否则如果hasShownPromo2 == false” - 在同时触发的情况下,只是firePromo()会评估,而不是firePromo2(),正确吗? – Joe
取决于你想要达到的目标。如果两个控制器都应该显示,你希望他们如何显示?例如。您可以将两个promo VC作为子控制器提供导航控制器;或者你可以出示第一个控制器,一旦它关闭,出现第二个控制器。 –