【问题标题】:Two UITabBarControllers sharing one ViewController (as tab content)?两个 UITabBarController 共享一个 ViewController(作为标签内容)?
【发布时间】:2015-01-03 05:44:48
【问题描述】:

情况:两个 UITabBarController,每个都有自己的选项卡,但 both 中的最后一个选项卡是相同的,所以希望 一个 UIViewController 显示内容。

运行时问题:共享项仅在显示时出现在一个选项卡集中。

问题:有人知道如何实现这项工作吗?

链接到故事板设置的外部图形:(抱歉,没有足够的声望在这里发布图片!) Storyboard graphic

带有该情节提要的 Xcode 项目: XCode Project

每个选项卡内容项都有自己的 UIViewController 类。除了使后退按钮起作用的行之外,它们不包含任何代码。

(是的,我知道这很奇怪。真实情况是一个 iPad 应用程序,其中选项卡控制器显示在弹出框中;弹出框是“属性编辑器”,其中不同的对象具有不同的属性,但都共享一组共同的属性...因此,一个标签用于“唯一”道具,一个共享标签内容用于所有对象都具有的“通用”道具。)

我已经找到了几种方法来获得我想要的效果,但是如果这个故事板有效,那将是一个更容易的解决方案。

-- 其他信息,与问题有些无关--

我正在使用的替代解决方案:TabBarControllers 仅链接到一个 VC 作为选项卡内容。当该选项卡 VC 加载时,我使用代码 (a) 通过标识符从情节提要中实例化共享 VC,(b) 通过 [tabController setViewControllers:list animated:NO] 将新的 VC 对象添加到 TabBarController。

(我更不喜欢的另一种可能的解决方案:不使用 TabBarController,并在内容 VC 中显示我自己的“选项卡”图形,每个都显示“我自己”被选中。Yuk。)

所以我有一个可行的解决方案,我只是想知道为什么它不起作用(只是 iOS API 中的一个已知事物,或者一些可能使其正常工作的神奇属性设置?)

【问题讨论】:

  • 注意不同关注点的类似问题(奇怪的事情发生在表格和重复使用的视图等......):stackoverflow.com/questions/8620619/…
  • 我不确定您要完成什么。您在代码中添加第二个选项卡的解决方案可以在情节提要中完成,只需复制共享控制器并将一个实例连接到每个选项卡栏控制器即可。在任何一种情况下,您都会得到两个不同的“共享”控制器实例。
  • 当我决定它需要具有不同的背景颜色和按钮布局时,我想要完成的是不必在“一个”故事板场景的多个副本中编辑 UI 布局。在此示例中,将只有两个副本。在我的实际应用中,可能会有 10 多个,因此希望分享。试图避免将 UI 外部化为 .XIB 文件并从那里加载,而这正是故事板的目的。

标签: ios uitabbarcontroller


【解决方案1】:

您不能将相同的视图控制器实例放入两个选项卡控制器中。问题是视图 (UIView) 实例只能有一个父视图 (superview)。当您尝试将视图控制器添加到第二个选项卡时,视图控制器的视图会从其第一个父级(第一个选项卡)中删除,然后添加到第二个选项卡。

【讨论】:

  • 我不反对,但我不确定这是问题的根源。整个 TabBarController 按钮消失了,而不仅仅是视图。第二个 ViewController 根本不会在第二个 TabBarController 的 ViewControllers 数组中设置。虽然 [view addSubview:sub] 确实会导致从任何现有父视图中删除子作为副作用,但问题似乎比这更复杂。我想确认苹果的 Storyboard 实现无法自动实例化 SharedViewController 的两个实例(创建两个视图对象)。
  • 另外:一次只显示一个TabBarController,为什么不能充分利用SharedViewController的一个实例呢?我同意同时在两个地方使用 View 会出现问题,但这里不是这种情况,除非 API 在未呈现时将故事板的完整 ViewController 集保存在内存中。您首先显示哪个 TabBarController 似乎并不重要,因此当您显示它时,它并不是在“控制”视图,因此第二个演示文稿稍后会从其他人的层次结构中获取视图。选项卡从不显示在第二个 TBController 中。
【解决方案2】:

我今天遇到同样的问题时偶然发现了您的帖子... 解决方案是在故事板中复制视图控制器并将副本附加到另一个选项卡栏控制器。 我刚做了它,它的工作... 我认为'rdelmar'是正确的......复制它并设置它..!!

【讨论】:

  • 因此,每次您想要更改布局时,都会产生更新十几个故事板场景副本的噩梦。复制东西并在多个地方使用相同但不同的副本只会让我的程序员想吐一点...... :-)
【解决方案3】:

我今天遇到了同样的问题。我设法想出了一个似乎可以解决问题的解决方法。关键是在标签栏和你想要复用的控制器之间增加一层分隔。从每个选项卡栏,我创建了与具有容器视图的不同 UIViewController 的关系。然后,您可以从容器到您实际想要作为选项卡视图重用的控制器进行“嵌入”segue。它不像直接连接那样干净(不确定为什么不支持),因为您必须为每个重用案例创建一个控制器类。它仍然是一个比每次使用都必须复制实际选项卡视图(以及连接到它的任何其他视图)的噩梦更好的解决方案。

希望这会有所帮助。如果有人需要更多详细信息,请告诉我。

【讨论】:

  • 我显然继续前进(并继续进行复制),但我认为您的解决方案会起作用......假设您可以为内容视图控制器设置多个“入站”ebed segues。你是对的,它不那么直接,并且会造成痛苦,因为选项卡控制器不能直接引用它的内容(这将是容器视图控制器)。但显然没有人发布更好的解决方案...... :-)
猜你喜欢
  • 2021-06-27
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2013-08-05
  • 2014-10-06
  • 2019-04-02
相关资源
最近更新 更多