在我的项目中,我基于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还有额外的逻辑。所以两者都有可能评估。
安全地处理这两个视图控制器的呈现,如果两者都会同时触发,最好的方法是什么?
做一个其他/如果测试,而不是连续的,如果? – Larme
@Larme - 如果我这样做“否则如果hasShownPromo2 == false” - 在同时触发的情况下,只是firePromo()会评估,而不是firePromo2(),正确吗? – Joe
取决于你想要达到的目标。如果两个控制器都应该显示,你希望他们如何显示?例如。您可以将两个promo VC作为子控制器提供导航控制器;或者你可以出示第一个控制器,一旦它关闭,出现第二个控制器。 –