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