我有一个tabBar控制器,其中包含5个项目。前三项使用相同的viewController作为UI设计,功能几乎相同。所以我为前三个项目制作了一个View Controller。但我无法弄清楚如何在tabBar控制器中多次添加相同的viewController。是否有可能或违反苹果规则?
答案 0 :(得分:1)
您可以多次将标签栏控制器链接到视图:结果是标签栏上的多个标签链接到同一个GUI但控制器为每个版本实例化一次 - 即它们各自由不同的相同类型的视图控制器。
要做到这一点:
但是,这确实会限制这些标签栏项目具有完全相同的GUI。如果您确实需要稍微不同的GUI但避免代码重复,则可以为每个视图创建不同的视图,然后为每个视图使用相同的UIViewController类(这通常适用于视图,而不仅仅是TabBarItems。)
在故事板中,您可以通过以下方式执行此操作:
您需要将故事板中需要插座或操作的任何控件链接到共享此控制器的每个视图的代码。
请务必注意,对于链接到类的每个视图,都会为您创建此类的新实例化(即您将视图链接到相同的类型控制器,而不是相同的控制器)。因此,如果您需要在视图控制器之间共享数据或状态信息,则必须使用常规机制将其传递给它们。
答案 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"
}
}