Ios UISplitViewController作为自定义选项卡栏控制器的子级

Ios UISplitViewController作为自定义选项卡栏控制器的子级,ios,swift,uitabbarcontroller,uisplitviewcontroller,Ios,Swift,Uitabbarcontroller,Uisplitviewcontroller,我一直在为iPad应用程序创建一个自定义选项卡栏控制器,因为我想实现一个垂直选项卡栏。但是,我希望其中一个选项卡显示一个uiplitviewcontroller,而其他选项卡仅显示uiviewcontroller。我的问题是: 1) 应用商店会接受这一点吗?苹果公司的文档目前指出,不建议将UISplitViews添加为子视图,但可以使用某些容器实现。有人有过这方面的经验吗 2) 下面是我的自定义选项卡栏控制器的摘录。如果secondViewController正在显示UISplitView,我可

我一直在为iPad应用程序创建一个自定义选项卡栏控制器,因为我想实现一个垂直选项卡栏。但是,我希望其中一个选项卡显示一个
uiplitviewcontroller
,而其他选项卡仅显示
uiviewcontroller
。我的问题是:

1) 应用商店会接受这一点吗?苹果公司的文档目前指出,不建议将
UISplitViews
添加为子视图,但可以使用某些容器实现。有人有过这方面的经验吗

2) 下面是我的自定义选项卡栏控制器的摘录。如果secondViewController正在显示UISplitView,我可以保持原样吗?我的意思是,当我运行它时,它看起来很有效,但它可以接受吗

class CustomTabBarController: UIViewController {

    @IBOutlet weak var tabView: UIView!
    @IBOutlet var tabButtons: [UIButton]!

    var firstViewController: UIViewController!
    var secondViewController: UISplitViewController!
    var thirdViewController: UIViewController!
    var viewControllerArray: [UIViewController]!
    var selectedTabIndex: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        firstViewController = storyboard.instantiateViewController(withIdentifier: "firstVC")
        secondViewController = storyboard.instantiateViewController(withIdentifier: "secondVC") as! UISplitViewController
        thirdViewController = storyboard.instantiateViewController(withIdentifier: "thirdVC")
        viewControllerArray = [firstViewController, secondViewController, thirdViewController]

        tabButtons[selectedTabIndex].isSelected = true
        didPressTab(tabButtons[selectedTabIndex])    
    }
3) 我真的不知道在
AppDelegate
中需要做什么(如果有的话)?再次似乎运行良好,但只是想知道它是否安全

谢谢。

1)我相信苹果只是反对这一潜在的糟糕设计,因为他们会让你参考。你不必总是同意他们的建议,你的应用很少会因为设计选择而被拒绝——我脑子里想的唯一的例子就是模仿应用商店或其他核心操作系统功能

2) 如果,正如你所说,这是有效的,我看不到任何明显的问题

3) 同样,如果它起作用,你可能不需要做任何事情。但以下是苹果如何为主细节应用程序设置模板:

如果您的splitViewController是这样设置的,并且您希望与此模板具有相同的功能,那么您可以通过以下方式获得它

首先将其添加到AppDelegate.swift的最底部:

extension AppDelegate: UISplitViewControllerDelegate {

    func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto primaryViewController:UIViewController) -> Bool {
        guard let secondaryAsNavController = secondaryViewController as? UINavigationController else { return false }
        guard let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController else { return false }
        if topAsDetailController.detailItem == nil {
            // Return true to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
            return true
        }
        return false
    }
}
然后,将其添加到CustomTabBarController中viewDidLoad的末尾:

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}

let navigationController = secondViewController.viewControllers[secondViewController.viewControllers.count-1] as! UINavigationController
navigationController.topViewController!.navigationItem.leftBarButtonItem = secondViewController.displayModeButtonItem

secondViewController.delegate = appDelegate

如果它运行良好,那么最好将它转移到代码审查。谢谢-将给它一个快照谢谢你的回复。我想是前者吧!我知道,例如,如果您在Xcode中启动一个主细节应用程序,它会在App delegate中声明拆分视图委托、根视图控制器等。由于这里的设置稍有不同,我很好奇是否需要这样做,如果需要,是否仍在那里或其他地方声明。谢谢,将有一个发挥!