在选项卡栏中第二次打开视图控制器时,大型标题崩溃应用程序



我有一个表格栏根视图控制器设置为导航视图控制器,其中只有一个表视图。

当我将导航栏大标题设置为始终或自动时,当我第二次打开选项卡时,它会使应用程序崩溃。

错误消息如下所示:

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的子类中启用/禁用大标题,这样它们就不会同时使用大标题。这样做的好地方是viewWillAppearviewWillDisappear方法

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
}

最新更新