因此,我的用例是在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来显示行为。
编辑:我不知道这是否重要,但是该项目仅适用于景观。
答案 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级别上进行的。