【问题标题】:Tab Bar Controller with seven tabs, Five tabs lead to Split View Controllers带有七个选项卡的选项卡栏控制器,五个选项卡导致拆分视图控制器
【发布时间】:2016-02-25 14:31:25
【问题描述】:

我已经做了很多研究并阅读了很多关于将标签栏控制器与拆分视图控制器一起使用的信息,但似乎找不到任何关于如何解决我的问题的提示...

Apple Developer Forum for Cocoa Touch 中标题为 "Place SplitViewController inside TabBarController" 的以下帖子迄今为止给了我最大的领先优势。

从 iOS 8 开始,在标签栏控制器中嵌入拆分视图控制器 (或您自己的容器视图控制器)受支持并有望 '只是工作'。将拆分视图控制器推送到导航堆栈上 仍然不受支持。

这似乎违反了 Apple 文档,包括 2014 年 11 月标题为 "Combined View Controller Interfaces" 的文章。

您可以使用 UIKit 框架提供的视图控制器 自己或与其他视图控制器一起创建 更复杂的界面。组合视图控制器时, 然而,收容顺序很重要;只有确定 安排有效。收容顺序,从孩子到 父,如下:

  • 内容视图控制器和容器视图控制器具有 灵活的边界(例如页面视图控制器)
  • 导航视图控制器
  • 标签栏控制器
  • 拆分视图控制器

我有一个带有七个标签的UITabBarController。其中,五个标签指向UISplitViewControllers,两个标签指向UINavigationControllers。

这是一些故事板的屏幕截图,显示了标签栏控制器通向五个拆分视图控制器中的三个...

当我使用self.traitCollection.horizontalSizeClass = UIUserInterfaceSizeClassRegular 运行目标时没问题 - 设备屏幕的水平(宽度)尺寸为常规(非紧凑) -> 在 iPad 上运行。所有七个选项卡都出现在底部选项卡栏上,所有视图控制器(包括拆分视图控制器)都可以正常工作。

我的问题?

当我使用self.traitCollection.horizontalSizeClass = UIUserInterfaceSizeClassCompact 运行目标时,Xcode 会吐出错误并冻结应用程序操作 - 其中设备屏幕的水平(宽度)尺寸为紧凑 -> 在 iPhone 或 iPhone Plus 上运行。 IB 和 iOS 设备上的结果与预期相同。

错误信息:Split View Controllers cannot be pushed to a Navigation Controller <UIMoreNavigationController: 0x7ffda38b0200>

我知道我收到错误消息的原因。在水平尺寸等级为“紧凑”的情况下,屏幕上的七个选项卡下降到五个,其中包括一个(iOS 专门准备的)“更多”选项卡。其余三个选项卡归入“更多”选项卡,它是它自己的导航控制器和表格视图控制器。我的故事板正在尝试将拆分视图控制器推送到此导航堆栈上。

对合法解决方案有任何想法吗?

【问题讨论】:

  • 如何构建自定义标签栏控制器?我很惊讶这种情况并不常见。
  • @C.Skjerdal 这是一个有趣的问题,答案可能过于复杂,无法在 cmets 中提供,所以我可能会更新我的问题......基本上自定义标签栏是可能的,但很复杂。一些应用程序使用汉堡图标来打开/关闭侧边栏菜单,以克服紧凑尺寸类的标签栏限制。我更喜欢 UI 询问这一长期更容易的替代任务,挑战标签栏中为使应用程序易于使用所需的最低要求,通过其他控件和视图控制器提供对所需功能/特性的访问.

标签: ios objective-c uiviewcontroller uitabbarcontroller uisplitviewcontroller


【解决方案1】:

我建议使用带有“更多”部分的自定义标签栏控制器,该部分不会将视图控制器推送到导航控制器中。最好是 UITabBarController 的子类,因此您可以将它与 Interface Builder 一起使用。

我的方法是用您自己的视图控制器替换当前的“更多”表视图控制器,该控制器显示溢出选项卡的列表,但在显示时不会将其相应的视图控制器推入导航栏。

一种可能的策略是成为 UITabBarController 的更多导航控制器的委托(在标签栏控制器的 moreNavigationController 属性中找到)。然后使用委托方法,例如 navigationController:willShowViewController:animated:,如果要显示的视图控制器不是您自定义的“更多”视图控制器,则替换导航控制器的 viewControllers 数组的内容。

我还没有尝试过,但这似乎是一个很好的起点,并且不需要太多关于 tabview 控制器内部的知识。

【讨论】:

  • 一些有趣的想法,感谢@ScottAhten... 会考虑这些方法并让您知道它是如何工作的。
  • 我遇到了类似的问题,但它不起作用。 navigationController:willShowViewController:animated: 未被调用,当您选择 UISplitViewController
猜你喜欢
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多