UINAvigationController -> setViewControllers 导致崩溃

Posted

技术标签:

【中文标题】UINAvigationController -> setViewControllers 导致崩溃【英文标题】:UINAvigationController -> setViewControllers causes a crash 【发布时间】:2017-05-26 07:59:23 【问题描述】:

我在这里遇到了一个非常奇怪的情况 - 调用 method UINAvigationController -> setViewControllers:animated: 会导致应用程序崩溃。仅在 ios 10.3.2 和我在发布模式下构建应用程序时才会发生这种情况。

我收集了更多详细信息。希望他们能帮助了解发生了什么。

该问题仅在 iOS 10.3.2 和发布模式下出现。我已经在 10.3.2 的 iPhone 上检查了这一点,发布构建失败,但调试工作正常。此外,我在 iOS 10.3.2 上从 AppStore 检查了该应用程序的早期版本,也可以。调试和发布版本在所有以前的 iOS 版本上都可以正常工作。

AppStore 中以前的版本是用旧版本的 Xcode 构建的,现在我使用的是最新的 Xcode 8.3.2。我想这是系统问题,与 iOS 和 Xcode 版本有关。

关于来源,它看起来像:

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    ...
    window = UIWindow(frame: UIScreen.main.bounds)
    ....
    let navigationController = UINavigationController(rootViewController: viewController)
    window.rootViewController = navigationController
    window.makeKeyAndVisible()

ViewController.swift

override func viewDidLoad() 
    super.viewDidLoad()
    ...
    continueButton.addTarget(self, action: #selector(navigateForward), for: .touchUpInside)
    ...


func navigateForward(sender: UIButton!) 
    let nextController = FinalBuilder.viewController()
    navigationController?.setViewControllers([nextController], animated: true)

我之前说过,它在所有情况下都可以正常工作,除了一种 :)。 UINAvigationController -> setViewControllers:animated: 是标准的 iOS 方法,可从 iOS 3.0+ 开始使用,现在不推荐使用。没有黑客或其他可以破坏程序流程的东西。并且是常用的使用方式。

附:没有调试日志或任何其他我可以为您提供的消息,因为该应用程序只是从屏幕上消失,根本没有任何通知。

【问题讨论】:

你能粘贴确切的崩溃错误信息吗? 没有错误信息。我在描述中提到过。 那么你是怎么知道setViewControllers导致了崩溃的? 因为没有这个调用就不会发生崩溃:)。如果我改用 pushViewController 方法,它可以正常工作。无论如何,我想出了问题的真正原因。感谢您的 cmets。 【参考方案1】:

如果它不起作用,那么你可以尝试简单的方法

简单的创建视图控制器对象并传入导航

let nextVC = storyboard?.instantiateViewController(withIdentifier:"ScrollViewController") as! ScrollViewController
self.navigationController?.pushViewController(nextVC, animated: true)

【讨论】:

【参考方案2】:

我发现这种行为是在将 RxCocoa 从 3.3.1 更新到 3.4.0 之后出现的。发生这种情况是因为DelegateProxyType.swift : extension ObservableType : func subscribeProxyDataSource 中的以下更改:

     return Disposables.create  [weak object] in
         subscription.dispose()
-       unregisterDelegate.dispose()
         object?.layoutIfNeeded()
+       unregisterDelegate.dispose()
     

我已将报告发布到ReactiveX/RxSwift 存储库。如果您有兴趣,可以在那里查看最终状态。

【讨论】:

以上是关于UINAvigationController -> setViewControllers 导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?

UINavigationController 与 AppDelegate 中的 UISegmentedControl 切换 UINavigationController 的 rootviewcontr

从一个 UINavigationController 到另一个 UINavigationController (Swift iOS 9, xcode 7)

UINavigationController