【问题标题】:Large title crash application when view controller is opened for 2nd time in tab bar在选项卡栏中第二次打开视图控制器时的大型标题崩溃应用程序
【发布时间】:2017-11-01 11:53:35
【问题描述】:

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

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

错误信息如下所示:

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

【问题讨论】:

  • 显示您的故事板树结构。例如。 UITabBarController > UINavigationController > UIViewController > UITableView
  • @JD。我添加了截图。
  • iOS 11 中的特定控制器结构似乎有问题。希望苹果尽快解决。
  • 这方面有什么更新吗?顺便说一句,它与故事板无关,我正在逐步使用 Autolayout

标签: ios swift uitableview uitabbarcontroller uinavigationbar


【解决方案1】:

找到了! 似乎是堆栈中有多个导航控制器的错误。

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

UINavigationController
UITabBarController 
UINavigationControllers (Different tab items)

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

【讨论】:

  • 听起来合乎逻辑..!同一期及其 2018 年中期
  • 如果我想保留主导航控制器怎么办?
  • 这也是我的应用程序结构,我也收到此错误,我不知道该怎么办..
  • 我只是建议在根导航控制器上将preferedLargeTitles 属性设置为false。 navigationController.navigationBar.prefersLargeTitles = false navigationController.navigationItem.largeTitleDisplayMode = .never
  • 当您想与多个导航控制器一起使用时,@big-toni 的答案是正确的。
【解决方案2】:

如果真的要使用封闭式navigationController,可以设置:

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

在里面添加 tabBarController 之前,在那个封闭的 navigationController 上:

[navVC setViewControllers:@[_tabBarController]];

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

【讨论】:

  • 这是使用 TabBarController 时的正确答案。谢谢。
【解决方案3】:

你应该禁用父导航控制器的大标题(我猜你有多个)

self.navigationBar.prefersLargeTitles = false

【讨论】:

    【解决方案4】:

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

    关键是现在 UIScrollView 只有一个观察者(navigationController)实现 _scrollViewWillEndDraggingWithVelocity。

    if (@available(iOS 11.0, *)) {
    
        self.navigationController.navigationBar.prefersLargeTitles = FALSE;
        self.navigationController.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever;
    
    }
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多