首页 文章

UITabBarController是UiSplitViewController的主人

提问于
浏览
9

我想实现与Facebook Messenger应用程序相同的流程,在主视图中有一个标签栏控制器 . 见
enter image description here

我完全按照这个答案中的描述做了Create a TabBar Controller with a Master-detail template?

然而!它在iPhone上无法正常工作,仅适用于iPad . 在iPhone上,向后导航不起作用 . 细节窗格打开就像一个模态序幕,不可能向后移动 . 这可能是什么错误?这甚至可以用标准的uisplitviewcontroller实现吗?我已经尝试在tabbarcontroller中嵌入navigationcontroller(在主视图中将导航控制器设置为root),然后它适用于iPhone但不适用于iPad .

1 回答

  • 4

    我最后通过不使用 UITabBarController 来解决这个问题,而是创建一个继承自 UIViewController 的CustomTabBarController . 自定义控制器的视图底部有一个 UITabBar ,而容器视图中嵌入了多个其他 UIViewController . 自定义控制器将 isHidden 属性设置为 true ,用于所有嵌入式视图控制器,但对应于所选选项卡的控制器除外 .

    以下是一个带有两个标签的简单示例,标签由标签标识:

    class CustomTabBarController: UIViewController, UITabBarDelegate {
    
        @IBOutlet weak var tab1View: UIView!
        @IBOutlet weak var tab2View: UIView!
        @IBOutlet weak var tabBar: UITabBar!
    
        override func viewDidLoad() {
            tabBar.delegate = self
        }
    
        func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
            tab1View.isHidden = item.tag != 1
            tab2View.isHidden = item.tag != 2
        }
    }
    

    此自定义控制器应设置为 UINavigationController 的根,该自身应设置为拆分视图控制器的主控制器:

    Storyboard showing custom tab bar controller in a split view controller

    此设置适用于iPad和iPhone:

    iPhone screenshot showing split view in combined mode

    iPad screenshot showing split view in split mode

    这种方法有一些缺点:

    • 自定义选项卡控制器不太容易使用 - 添加新选项卡要求您添加另一个嵌入视图并将其连接到控制器中的插座 .

    • 设置导航项的 Headers 以及左右栏按钮项必须在选项卡选择时在自定义选项卡栏控制器中完成 .

    • 此方法使用(我认为)比常规 UITabBarController 更多的内存,因为所有子视图控制器在应用加载后立即加载,而不是在首次显示时加载 .

    • 此设置将导致在(纵向)iPhone模式下显示细节时隐藏标签栏 . 这就是我想要的,也是Facebook Messenger应用程序中的行为,但如果您希望标签栏永久可见,则此方法不会这样做 .

相关问题