当我合拢/展开屏幕时,displayModeButtonItem消失了

时间:2018-07-20 04:04:36

标签: ios swift uisplitviewcontroller

因此,我的用例是在detailview中有一个TabBarController,大约有四个选项卡,每个选项卡都有自己的NavigationController。全部通过情节提要。然后在我的App Delegate上,我有这个东西:

let splitViewController = self.window!.rootViewController as! UISplitViewController
splitViewController.preferredDisplayMode = .allVisible
let tabBarController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UITabBarController
for item in tabBarController.viewControllers!{
        let navigationController = item as! UINavigationController
        navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem
}

因此,每个Button上都有一个NavigationController。问题首先是当我使用第一个选项卡上的按钮时,它可以正常工作,但是当我移动选项卡时,当我返回上一个选项卡并使用该按钮时,它便消失了。然后,当我切换到另一个选项卡时,它会返回。令人惊讶的是,这在最后一个选项卡上没有发生。我已经尝试寻找解决方案,但找不到任何解决方案。所以我现在处于低迷状态。

我添加了gif来显示行为。

enter image description here

编辑:我不知道这是否重要,但是该项目仅适用于景观。

2 个答案:

答案 0 :(得分:1)

我相信这是一个UIKit错误。行为实际上取决于设置navigationItem.leftBarButtonItem的视图控制器的顺序。该错误将在查看最后一个错误后开始再现。

不过,有一个解决方法。将此添加到实现UISplitViewControllerDelegate中的UISplitViewController

的对象中
func splitViewController(_ svc: UISplitViewController, willChangeTo displayMode: UISplitViewControllerDisplayMode) {
    DispatchQueue.main.async {
        let tabBarController = svc.viewControllers.last as! UITabBarController
        let navigationController = tabBarController.selectedViewController as! UINavigationController
        navigationController.viewControllers.first?.navigationItem.leftBarButtonItem = nil
        navigationController.viewControllers.first?.navigationItem.leftBarButtonItem = svc.displayModeButtonItem
    }
}

在没有DispatchQueue.main.async的情况下也可以使用,但是leftBarButtonItem的位置由于某些原因是错误的,而且我不知道更新其布局的方法。

希望有帮助。

答案 1 :(得分:1)

我会在Apple的官方支持下添加答案作为补充信息,以防万一有人怀疑:

“ UISplitViewController的displayModeButtonItem一次只能位于视图层次结构中的一个位置,而不能位于多个位置或多个视图控制器。当前,您将其指向选项卡栏中的所有视图控制器。 如我们所见,这样做会产生不可预测的结果。”

被接受的答案虽然很棘手,但可以工作。不过,Apple的支持建议是在TabBarController级别上进行的。