UINAvigationController -> setViewControllers 导致崩溃

UINAvigationController -> setViewControllers causes a crash

我这里有一个非常奇怪的情况 - 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+ 获得并且现在没有弃用。没有黑客攻击或其他可以破坏程序流程的东西。而且是常用的使用方式。

P.S。我无法向您提供调试日志或任何其他消息,因为应用程序只是从屏幕上消失,根本没有任何通知。

如果它不起作用,那么您可以尝试像

这样简单的方法

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

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

我发现这个行为出现在 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 存储库。如果您有兴趣,可以在那里查看最终状态。