在UISplitViewController中,如何使主控打开iPhone的明细视图控制器?

时间:2019-05-25 20:31:54

标签: ios swift uisplitviewcontroller

我有一个独特的UISplitViewController设置(我认为)。我的主视图控制器是导航控制器中的一个表视图控制器,这很正常。但是,我的详细信息视图控制器是UITabBarController。每个标签都有一个导航控制器,用于将内容包装在其中。

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

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上效果很好。在主视图控制器表中选择一个项目会在详细视图控制器中选择选项卡,并将视图控制器推入该选项卡。

在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
  }
}

但是,在主视图控制器表中选择一行实际上不起作用。当选择主表中的一行时,如何显示详细视图控制器?

1 个答案:

答案 0 :(得分:1)

首先,为什么需要两个功能:Master-DetailTab。因为如果要使用制表符实现母版详细信息,那么在Master中必须具有相同数量的制表符和相同数量的行,因此选择行时只有您可以导航到该制表符。在iPhone中,最多只能有5个标签,如果Master中有7行,那么如果用户单击第6行和第7行会发生什么情况?

因为按照设计概念:您只能根据要求选择一个。

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

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

就像您在iPad上所说的那样,它工作正常。因此,对于iPhone,您可以采用以下方式:

    情节提要中的
  1. UI应类似于: TabBar as DetailView
  2. 在您的项目中创建或添加UITabBarController。 (我创建了名为CustomTabController的tabbarcontroller)。
  3. 然后在didSelectRowAt中,按下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
        }
    }
    

但是请确保您具有与行数相同的选项卡数。