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)