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

UISplitViewController as child of custom tab bar controller

我一直在关注 this tutorial 为 iPad 应用程序创建自定义标签栏控制器,因为我想实现垂直标签栏。但是,我希望其中一个选项卡显示 UISplitViewController,而其他选项卡只显示 UIViewControllers。我的问题是:

1) 这会被应用商店接受吗? Apple 的文档当前声明不建议将 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) 我相信 Apple 只是建议不要将此视为潜在的不良设计,因为他们将您推荐给 Human Interface Guidelines。您不必总是同意他们的建议,而且您的应用很少会因为设计选择而被拒绝——我唯一想到的例子就是模仿 App Store 或其他核心 OS 功能。

2) 如果像您所说的那样有效,我没有发现任何明显的问题。

3) 同样,如果它正常工作,您可能不需要执行任何操作。但以下是 Apple 为 Master-Detail 应用程序设置模板的方式:

如果您的 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