【问题标题】:Why is the iOS 11: self.performSegue() not working?为什么 iOS 11:self.performSegue() 不起作用?
【发布时间】:2018-03-08 04:56:54
【问题描述】:

我今天开始迁移到 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

预期结果:新控制器推送

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

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

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

注意,我也试过这个sn-p,结果一样。

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

【问题讨论】:

  • 从情节提要中删除 segue 并重新添加。
  • @RashwanL 遗憾的是没有变化
  • 该 segue 标识符的评估结果是否符合您的预期?
  • @JackDaw 添加了一些额外的代码。是的,const 评估为正确记录prepareForSegue 的“showIntroSegue” - 另请注意,在除 11 之外的所有其他 iOS 上,它都可以正常工作。设备和模拟器上存在问题。
  • 我会在目标 VC init、viewDidLoad 等中放一些日志。

标签: ios swift swift3 ios11 xcode9


【解决方案1】:

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

【讨论】:

  • :- 我的应用程序中也遇到了类似的问题。PushNavigation 在 iOS11 中不起作用。如果您在 applicationDidBecomeActive 中有一些逻辑。那为什么它在 iOS 10 中运行良好??
  • @Developer 因为只有 iOS 11 在使用 Facebook 登录时会添加额外的警报。这个警报触发了一个额外的“appliationDidBecomeActive”,所以我最终得到了 2 个视图控制器。
【解决方案2】:

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

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

【讨论】:

  • 考虑到减少需要在 viewWillAppear 或 viewDidAppear 中执行的应用程序和类状态的概念,需要评估类作用域状态,因为每次视图出现时都会调用 viewWillAppear 和 viewDidAppear 以防止每次都调用 segue,这反过来又带来了它是一个错误而不是安全功能的概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 2014-03-25
  • 2016-06-29
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多