我可以在TabBarController中多次添加相同的ViewController

时间:2018-01-07 06:11:17

标签: ios uitabbarcontroller

我有一个tabBar控制器,其中包含5个项目。前三项使用相同的viewController作为UI设计,功能几乎相同。所以我为前三个项目制作了一个View Controller。但我无法弄清楚如何在tabBar控制器中多次添加相同的viewController。是否有可能或违反苹果规则?

2 个答案:

答案 0 :(得分:1)

您可以多次将标签栏控制器链接到视图:结果是标签栏上的多个标签链接到同一个GUI但控制器为每个版本实例化一次 - 即它们各自由不同的相同类型的视图控制器。

要做到这一点:

  • 如果故事板尚未打开,请在故事板中打开文档大纲。
  • 右键单击标签栏控制器,然后向下拖动到您希望成为标签栏项目的视图并发布。

enter image description here

  • 在显示的弹出菜单中,选择关系类型为'查看控制器'。

enter image description here

  • 重复多次,因为您需要重复的标签栏项目。

但是,这确实会限制这些标签栏项目具有完全相同的GUI。如果您确实需要稍微不同的GUI但避免代码重复,则可以为每个视图创建不同的视图,然后为每个视图使用相同的UIViewController类(这通常适用于视图,而不仅仅是TabBarItems。)

在故事板中,您可以通过以下方式执行此操作:

  • 在故事板中选择项目,
  • 打开公用事业'右侧的侧边栏,如果尚未打开,
  • 打开' Identity Inspector',
  • 在' Custom Class',' Class'选择器,选择您的类名(类类型必须与您尝试将其链接到的视图类型相匹配)。

enter image description here

您需要将故事板中需要插座或操作的任何控件链接到共享此控制器的每个视图的代码。

请务必注意,对于链接到类的每个视图,都会为您创建此类的实例化(即您将视图链接到相同的类型控制器,而不是相同的控制器)。因此,如果您需要在视图控制器之间共享数据或状态信息,则必须使用常规机制将其传递给它们。

答案 1 :(得分:0)

@Ali Beadles的答案是正确的。我只是提出一种替代方法。

如以上答案中所述,您可以拖放以将多个关系设置到同一ViewController。它将创建多个选项卡栏项目,每个项目都将实例化同一视图控制器的新实例。为了自定义标签栏项目,请对您的UITabBarController子类化。

    class YourTabViewController: UITabBarController {
        override func viewDidLoad() {
            super.viewDidLoad()
            setTabBarItem()
        }
        func setTabBarItem(){
//supposing you have only 2 tabbar items add as many as you need
            let myTabBarItem0 = (self.tabBar.items?[0])! as UITabBarItem
            myTabBarItem0.image = UIImage(named: "Icon_Inbox")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
            myTabBarItem0.selectedImage = UIImage(named: "Icon_Inbox ")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
            myTabBarItem0.title = "Test"

            let myTabBarItem1 = (self.tabBar.items?[1])! as UITabBarItem
            myTabBarItem1.image = UIImage(named: "Icon_Outbox")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
            myTabBarItem1.selectedImage = UIImage(named: "Icon_Outbox ")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
            myTabBarItem1.title = "Test"
        }
    }

现在将情节提要中的UITabBarController的类更改为YourTabViewController,如下所示。 enter image description here