Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UISplitViewController中,如何使iPhone的主控打开细节视图控制器?_Ios_Swift_Uisplitviewcontroller - Fatal编程技术网

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

Ios 在UISplitViewController中,如何使iPhone的主控打开细节视图控制器?,ios,swift,uisplitviewcontroller,Ios,Swift,Uisplitviewcontroller,我有一个独特的UISplitViewController设置(我想)。我的主视图控制器是导航控制器中的表视图控制器,这是正常的。但是,“我的详细视图”控制器是一个UITabBarController。每个选项卡都有一个导航控制器来包装其中的内容 当用户在主视图控制器中选择一个表行时,我在详细视图控制器中选择一个选项卡,并开始推送视图控制器: let detailViewController = masterViewController?.splitViewController .view

我有一个独特的
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上,我使用以下命令在初始加载时显示主视图控制器:


但是,在主视图控制器表中选择一行实际上没有任何作用。如何使详细视图控制器在选择主表中的某一行时显示?

首先,您为什么需要这两种功能:
master detail
Tab
。因为如果要使用tab实现master detail,则必须在
master
中具有相同数量的选项卡和相同数量的行,然后只有在选择行时才能导航到该选项卡。在iPhone中,最多只有5个选项卡,如果您在
Master
中有7行,那么如果用户单击第6行和第7行会发生什么

因为按照设计理念:您应该根据需求只选择一个

  • Master Detail
    ->提供了侧菜单等功能,因此用户可以从这些功能中访问更多选项
  • TabBar
    ->提供更多选项,底部有菜单
  • 无论如何,您可能有一些独特的要求

    正如你在iPad上所说,它工作正常。因此,对于iPhone,您可以使用以下方法:

  • 故事板中的UI应类似于:
  • 在项目中创建或添加
    UITabBarController
    。(我已经创建了名为
    CustomTabController
    )的tabbarcontroller)
  • 然后在
    中选择Rowat
    ,按下Tabbar控制器:

    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
        }
    }
    
  • 但是要确保你有足够多的标签和行数相同。

    Apple说“…推到堆栈上。这个对象不能是标签栏控制器”,即使它可以工作。但是,我明白您的观点,为什么同时使用拆分视图和选项卡栏控制器。这让我想到重新设计它,也许放弃iPhone的分割视图会更好。虽然iOS 8支持拆分视图,但我认为它在现实世界中并不实用。为了支持iPad和iPhone,我不得不克服大量的漏洞和细微差别,这似乎太不自然了。谢谢你的建议!
    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
        }
    }