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

时间:2017-05-10 17:10:36

标签: ios swift uitabbarcontroller uisplitviewcontroller

我一直关注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 个答案:

答案 0 :(得分:0)

1)我认为Apple只是建议反对这可能是糟糕的设计,因为他们会引用你Human Interface Guidelines。您不必总是同意他们的建议,并且您的应用很少会因设计选择而被拒绝 - 我唯一的例子就是模仿App Store或其他核心操作系统功能。

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

3)如果它正常工作,你可能不需要做任何事情。但是,这就是Apple如何为Master-Detail应用程序设置模板:

storyboard

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