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

时间:2017-11-01 11:53:35

标签: ios swift uitableview uitabbarcontroller uinavigationbar

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

当我将导航栏大型标题设置为always或automatic时,当我第二次打开标签时,它会使应用程序崩溃。

错误信息如下所示:

Assertion failure in -[UITableView _addScrollViewScrollObserver:]*    
 Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
 reason: 'ERROR: UIScrollView does not support multiple observers implementing _scrollViewWillEndDraggingWithVelocity:targetContentOffset:'

我不知道如何修复它。提前谢谢。

sotryboard screenshot

6 个答案:

答案 0 :(得分:6)

发现它! 似乎是堆栈中有多个导航控制器的错误。

所以当我的结构是(从上到下)时:

UINavigationController
UITabBarController 
UINavigationControllers (Different tab items)

如果我删除到主NavigationController(顶部),则异常消失了! 希望他们能尽快解决。

答案 1 :(得分:1)

如果你真的必须使用封闭的navigationController,你可以设置:

[navVC.navigationBar setPrefersLargeTitles:NO];
[navVC.navigationItem setLargeTitleDisplayMode:UINavigationItemLargeTitleDisplayModeNever];

在封闭的navigationController之前添加tabBarController:

[navVC setViewControllers:@[_tabBarController]];

所以现在你使用嵌套在tabBarController中的navigationControllers上的大标题。关键是现在UIScrollView只有一个实现_scrollViewWillEndDraggingWithVelocity的观察者(navigationController)。

答案 2 :(得分:1)

您应该为父级导航控制器禁用大标题(我想您有多个标题)

self.navigationBar.prefersLargeTitles = false

答案 3 :(得分:1)

我找到了解决方案。您必须将第一个导航控制器设置为不使用大标题。

问题在于,现在UIScrollView仅具有一个实现_scrollViewWillEndDraggingWithVelocity的观察者(navigationController)。

cd ios
pod update Firebase

答案 4 :(得分:0)

我遇到了同样的问题,我通过从AppDelegate删除此行修复了此问题:

UINavigationBar.appearance().prefersLargeTitles = true

请检查my original answer

答案 5 :(得分:0)

我认为以上所有答案并不能真正解决问题,而且过于复杂。我建议在您的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
}