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 存储库。如果您有兴趣,可以在那里查看最终状态。
我这里有一个非常奇怪的情况 - 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 存储库。如果您有兴趣,可以在那里查看最终状态。