在UiSplitViewController的主视图中包含UITabBarController

10
我希望做到与 Facebook Messenger 应用程序相同的流程,即在主视图中使用选项卡控制器。参见enter image description here
我已经按照这个答案所描述的方式进行了操作Create a TabBar Controller with a Master-detail template?
然而!它在iPhone上无法正常工作,只能在iPad上正常工作。在iPhone上,导航倒退不起作用。详细面板像模态序列一样打开,没有回退的可能性。这里可能出现什么错误?使用标准的UISplitViewController实现这个目标是否可行?我也尝试将 NavigationController 嵌入在 TabBarController 中(使 NavigationController 成为 master view 的根),这样可以在 iPhone 上正常工作,但在 iPad 上不行。

您可能会在此处找到有关此问题的一些信息:https://dev59.com/D4zda4cB1Zd3GeqPr9x1 - Lasse1234
@Zeezer,你最终是如何解决这个问题的? - SAHM
@SAHM 无法解决,重新设计了我的流程。如果您找到适用于iPad和iPhone的解决方案,请发布它,我会接受它。谢谢。 - Zeezer
1个回答

5
我最终通过不使用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的根控制器,而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

这种方法也有一些缺点:

  • 自定义标签控制器不太容易使用——添加新标签需要在控制器中添加另一个嵌入式视图并将其连接到输出。

  • 设置导航项的标题、左右栏按钮必须在自定义标签栏控制器中,在选项卡选择时完成。

  • 这种方法使用了(我认为)比普通的UITabBarController更多的内存,因为所有的子视图控制器都在应用程序加载时加载,而不是在首次显示时加载。

  • 在(竖屏)iPhone模式下显示详细信息时,这种设置会导致标签栏被隐藏。这是我想要的行为,并且也是Facebook Messenger应用程序的行为,但如果你希望标签栏始终可见,这种方法就行不通了。


请纠正我,但是在传统的设置中,viewDidLoad会在连接到UITabBarController的每个选项卡上调用。因此,我认为您的解决方案中的内存开销与由苹果提供的第一方选项卡控制器没有太大区别。 - Atomhax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接