我有一个表格栏根视图控制器设置为导航视图控制器,其中只有一个表视图。
当我将导航栏大标题设置为始终或自动时,当我第二次打开选项卡时,它会使应用程序崩溃。
错误消息如下所示:
Assertion failure in -[UITableView _addScrollViewScrollObserver:]*
Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'ERROR: UIScrollView does not support multiple observers implementing _scrollViewWillEndDraggingWithVelocity:targetContentOffset:'
我不知道如何解决它。提前谢谢你。
索特里板截图
找到了!似乎是堆栈中有多个导航控制器的错误。
所以当我的结构是(从上到下):
UINavigationController
UITabBarController
UINavigationControllers (Different tab items)
如果我删除到主导航控制器(顶部),异常就消失了!希望他们能尽快修复它。
如果你真的必须使用封闭导航控制器,你可以设置:
[navVC.navigationBar setPrefersLargeTitles:NO];
[navVC.navigationItem setLargeTitleDisplayMode:UINavigationItemLargeTitleDisplayModeNever];
在该封闭导航控制器之前,在内部添加选项卡栏控制器之前:
[navVC setViewControllers:@[_tabBarController]];
所以现在你 san 在嵌套在 tabBarController 内的导航控制器上使用大标题。关键是现在UIScrollView只有一个观察者(navigationController)实现_scrollViewWillEndDraggingWithVelocity。
您应该禁用父导航控制器的大标题(我猜您有多个)
self.navigationBar.prefersLargeTitles = false
我找到了解决方案。 您必须将第一个导航控制器设置为不使用大标题。
关键是现在UIScrollView只有一个观察者(navigationController)实现_scrollViewWillEndDraggingWithVelocity。
if (@available(iOS 11.0, *)) {
self.navigationController.navigationBar.prefersLargeTitles = FALSE;
self.navigationController.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever;
}
上述所有答案都不能真正解决问题,而且过于复杂。我建议在每个UIViewController
的子类中启用/禁用大标题,这样它们就不会同时使用大标题。这样做的好地方是viewWillAppear
和viewWillDisappear
方法
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.largeTitleDisplayMode = .always
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.navigationBar.prefersLargeTitles = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.navigationBar.prefersLargeTitles = false
}