为什么 iOS 11: self.performSegue() 不起作用?

Why is the iOS 11: self.performSegue() not working?

我今天开始迁移到 Xcode 9 & iOS 11 版本。

在我的基于故事的应用程序中,以下代码:

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

预期结果:推送新控制器

实际结果iOS11:什么都没发生

知道原因是什么吗?

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

注意,我也试过这个片段,结果相同。

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

根据讨论,viewDidLoad 不适合放置调用执行 segue,但有很多用户案例希望在视图出现之前触发 segue,特殊情况因为它在之前一直有效X9,因为在导航控制器中有视图控制器或分派到主(在 viewDidLoad 中)时似乎会触发 segue,在呈现加载视图时应该已经在主线程上。

我认为这是一个错误,而不是一个未记录的功能。

我发现解决方案位于完全不同的地方(通常如此)。 原因是我在 applicationDidBecomeActive 中有一个逻辑正在替换当前的故事板(糟糕的方法!)——FB 套件的额外弹出窗口导致我的容器视图控制器的重新创建。因此,在执行 segue 的调用期间我有 self.navigationController == nil