为什么iOS 11中的self.performSegue()无法工作?

3

我今天开始迁移到Xcode9和iOS 11构建。

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

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

这段代码在之前的所有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的实际结果:没有任何反应

有什么想法是原因吗?

在使用AWSCognito / AWSFacebookSignInProvider进行成功登录后,将调用函数handleSuccessfulLogin(),这是一个Facebook登录。在iOS上,会出现一个新的弹出窗口继续使用Facebook,我怀疑这可能是原因,但我无法验证它。在第二次调用时,此弹出窗口不会出现(因为Facebook已获得授权),然后转换正确触发。

请注意,我也尝试过此片段,结果相同。

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

从你的Storyboard中删除segue,然后再次添加它。 - Rashwan L
这个segue是自定义的吗?它有一个segue.destinationController的值吗? - Larme
我意识到在第二次调用时它可以工作。在成功的AWSCognito / Facebook登录后,segue会自动触发。第一次,即使segue被触发(preparesegue已经记录出来),目标视图控制器也没有显示出来。在第二次点击(不会重新打开FB)时它确实可以工作。不确定这是什么意思。也许还有一些FB框架的残留物仍然“挡道” :/ - Sebastian Flückiger
handleSuccessfulLogin 在主线程上调用吗?如果失败,您可能需要查看视图层次结构:https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/special_debugging_workflows.html#//apple_ref/doc/uid/TP40015022-CH9-SW2 也许它因为未知原因被隐藏了,或者是 FB 导致的问题... - Larme
在视图生命周期中,您尝试在什么时候调用func handleSuccessfulLogin()方法?当调用此方法时,您的当前视图是否已经加载和呈现? - holex
显示剩余8条评论
2个回答

1
我发现解决方案完全在另一个地方(经常如此)。 原因是我在applicationDidBecomeActive中使用了一种逻辑来替换当前的storyboard(不好的方法!)- FB Kit的附加弹出窗口导致我的容器视图控制器被重新创建。 因此,在调用执行segue时,我有self.navigationController == nil

我在我的应用程序中也遇到了类似的问题。PushNavigation在iOS11中无法正常工作。如果你在applicationDidBecomeActive中有一些逻辑,那么为什么在iOS 10中它能够正常工作呢? - Developer
@开发者,因为只有iOS 11在使用Facebook登录时会添加额外的警报。这个警报会触发一个额外的“appliationDidBecomeActive”,所以我最终得到了2个视图控制器。 - Sebastian Flückiger

0
根据讨论,viewDidLoad不适合用于调用执行segue的位置,但有很多用户案例需要在视图出现之前触发segue,特殊情况是在X9之前已经起作用,因为当将视图控制器放在导航控制器中或者在viewDidLoad中分派到主线程时(应该已经在加载视图时在主线程上),segue似乎会被触发。

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接