详细说明 UISplitViewController 中的 UINavigationController 问题

Detail UINavigationController issue in UISplitViewController

我有当前 UISplitViewController 设置:

UISplitViewControllerUINavigationController 包含 UITableViewController 和详细控制器包含 UITabBarController.

代码:

    // Create split view controller
    let splitViewController = UISplitViewController()
    let masterViewController = UINavigationController(rootViewController: UITableViewController())
    masterViewController.topViewController?.title = "Master"

    // Create tab bar controller
    let tabBarController = UITabBarController()

    // Setup view controllers
    var viewControllers = [UIViewController]()
    for i in Range(start: 0, end: 4) {
        let vc = UIViewController()
        vc.view.backgroundColor = UIColor.whiteColor()
        vc.title = "View Controller \(i+1)"
        let navigationController = UINavigationController(rootViewController: vc)
        viewControllers.append(navigationController)
    }

    tabBarController.viewControllers = viewControllers
    splitViewController.viewControllers = [masterViewController, tabBarController]

在 iPhone 6S Plus 横向模式下产生以下结果:

问题:

旋转到纵向模式后,详细视图控制器中的 UINavigationController 被主视图控制器 UINavigationController 替换,而不是使用详细视图控制器中的导航控制器。

这显然是预期的行为,但我想使用详细视图控制器中的 UINavigationController,并且主视图控制器仍然有一个后退按钮。您可以查看 Facebook Messenger 应用程序以了解我在说什么。

这个问题与您试图在导航控制器中嵌入标签栏控制器并使其成为拆分视图控制器的详细视图控制器有关。

选项卡栏控制器希望更改所选选项卡的导航项,但您的层次结构与其期望的相反。

虽然选项卡栏控制器能够在未折叠的详细导航控制器上显示选定选项卡的导航项,但一旦折叠,事情就会崩溃,因为选项卡栏控制器没有意识到它已被推到查看主导航控制器的控制器堆栈。它在那个时候更新了错误的导航栏。

SDK 本身不支持特定的自适应 UI 层次结构。您可以提交功能请求,或者看看其他开发人员是否有代码来解决拆分视图控制器委托如何折叠嵌入式选项卡栏控制器的问题。