2017-09-26 60 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