2017-09-26 61 views
3

我开始迁移到Xcode 9 &今天iOS 11构建。iOS 11:self.performSegue()不工作

在我storybased的应用程序,下面的代码:

self.performSegue(withIdentifier: Const.UI.Segue.showIntro, sender: self) 

运行在所有的iOS以前(只是与iOS 10.3,10.0,9.0验证)罚款,但在iOS的11不运行

附加代码:

private func handleSuccessfulLogin() { 
    self.log.info("Logged In") 
    DispatchQueue.main.async(){ 
     self.performSegue(withIdentifier: Const.UI.Segue.showIntro, sender: self) 
    } 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    print("starting segue " + segue.identifier!) 
} 

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { 
    print("should perform segue") 
    return true 
} 

打印输出(iOS的11):

> Logged In 
> starting segue showIntroSegue 

预期结果:新控制器推

实际结果iOS的11:什么都没有发生

任何想法的原因可能是什么?

功能handleSuccessfulLogin()是在用登录名AWSCognito/AWSFacebookSignInProvider成功登录后调用的。在iOS上有一个新的弹出continue with facebook,我怀疑是原因,但没有办法验证它..在第二次调用这个弹出窗口不会出现(因为facebook已经被授权),然后segue正确触发。

请注意,我也试过这段代码,结果相同。

OperationQueue.main.addOperation { 
     [weak self] in 
     self?.performSegue(withIdentifier: Const.UI.Segue.showIntro, sender: self) 
    } 
+0

从您的故事板中删除segue并重新添加。 –

+0

@RashwanL不会悲伤 –

+0

那个segue标识符是否会评估您所期望的? –

回答

1

我发现解决方案是在一个完全不同的地方(经常这样)。 原因是我在applicationDidBecomeActive中有一个逻辑取代了当前的故事板(坏方法!) - FB Kit中的额外弹出窗口导致了我的容器视图控制器的重新创建。因此我在呼叫期间有self.navigationController == nil执行segue。

+0

: - 我的应用也面临类似问题.PushNavigation在iOS11中无法使用。如果你在applicationDidBecomeActive中有一些逻辑。那么为什么它在iOS 10中工作正常? – Developer

+0

@开发者,因为只有iOS 11在使用Facebook登录时添加了额外的警报。这个提醒引发了一个额外的“appidationDidBecomeActive”,所以我结束了2个视图控制器。 –

0

根据讨论,viewDidLoad是不合适的地方打电话进行SEGUE,但也有很多的用户情况下,希望的观点,因为它一直在努力之前的X9出现,特殊情况下才触发SEGUE,因为在视图控制器处于导航控制器中或调度到main(在viewDidLoad)时,segue似乎会触发,当呈现加载的视图时,它应该已经在主线程中。

这我会考虑一个错误,而不是一个无证的功能。

+0

考虑到减少需要在viewWillAppear或viewDidAppear中执行的应用程序和类的状态的概念,因为每次都会调用viewWillAppear和viewDidAppear,因此每次都会调用viewWillAppear和viewDidAppear以防止每次调用segue,这反过来又带来了它的概念是一个错误而不是安全功能。 – 51N4