在 UISplitViewController 中,如何让 master 打开 iPhone 的细节视图控制器?

In UISplitViewController, how to make master open detail view controller for iPhone?

我有一些独特的 UISplitViewController 设置(我认为)。我的主视图控制器是导航控制器中的 table 视图控制器,这是正常的。但是,我的详细视图控制器是 UITabBarController。每个选项卡都有一个导航控制器来包装内容。

当用户 select 在主视图控制器中有一个 table 行时,我 select 在详细视图控制器中的一个选项卡并开始推送视图控制器:

let detailViewController = masterViewController?.splitViewController
    .viewControllers[1] as? UITabBarController

let selectIndex = 2
let viewController = (detailViewController.viewControllers?[selectIndex] as? UINavigationController)?.viewControllers.first
detailViewController.selectIndex = selectIndex
viewController.show(myCustomViewController)

这在 iPad.. select 在主视图控制器中编辑项目 table select 在详细视图控制器中添加选项卡并推送视图控制器。

在 iPhone 上,我使用 this post:

在初始加载时显示了主视图控制器
class MasterViewController: UIViewController {
  private var collapseDetailViewController = true

  override func viewDidLoad() {
    super.viewDidLoad()
    splitViewController?.delegate = self
  }
  // ...
}

extension MasterViewController: UISplitViewControllerDelegate {
  func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
    return collapseDetailViewController
  }
}

extension MasterViewController {

  override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    collapseDetailViewController = false
    selectTabAndPush(index: 2, vc: myCustomViewController)
    // Tried swapping the order of these but still no luck
  }
}

但是,select在主视图控制器中设置一行 table 实际上什么都不做。如何让详细视图控制器在主 table 中的一行被 selected 时显示?

首先,为什么您需要这两个功能:Master-DetailTab。因为如果您使用选项卡实现主详细信息,那么您必须在 Master 中具有相同数量的选项卡和相同的行数,那么只有当您 select 行时,您才能导航到选项卡。在 iPhone 中最多只有 5 个选项卡,如果在 Master 中有 7 行,那么如果用户单击第 6 行和第 7 行会发生什么?

因为按照设计理念:按要求只能选一个。

  1. Master-Detail -> 提供侧边菜单等功能,因此用户可以从中访问更多选项。
  2. TabBar -> 底部有菜单,提供更多选项。

无论如何,您可能有一些独特的要求。

正如您在 iPad 中所说,它工作正常。所以对于 iPhone 你可以采用以下方式:

    情节提要中的
  1. UI 应该是这样的:
  2. 在您的项目中创建或添加 UITabBarController。 (我创建了名为 CustomTabController 的 tabbarcontroller)。
  3. 然后在didSelectRowAt, push tabbarcontroller :

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.phone {
            let tabController = self.storyboard?.instantiateViewController(withIdentifier: "CustomTabController") as! CustomTabController
            self.navigationController?.pushViewController(tabController, animated: true)
            tab.selectedIndex = indexPath.row
        }
        else {
            // iPad code here
        }
    }
    

但请确保您有足够数量的选项卡与行数相同。