如何将 UITabBarController 与多个故事板一起使用?

问题描述 投票:0回答:1

我刚刚在 Xcode 中创建了一个新项目。我的主故事板文件包含一个选项卡栏控制器作为初始视图和链接到它的五个导航控制器(每个控制器都链接到一个单独的视图控制器)。我决定为了提高工作效率,我应该为选项卡栏的五个部分中的每一个部分创建一个新的故事板文件。我将选项卡栏控制器留在主情节提要中,并将其余部分移至它们自己的情节提要文件中。我使用故事板引用将选项卡栏控制器链接到五个导航控制器,并且在主故事板中,选项卡栏显示正确的图像和标题。但是,当我在模拟器或设备上运行该应用程序时,选项卡栏突然不可见。我仍然可以单击选项卡来更改要在选项卡栏控制器内显示的导航视图,但它只是不可见。顺便说一句,到目前为止我还没有在项目中添加任何代码。

我看到了多个关于带有选项卡栏控制器的单独故事板文件的教程,但它们的作用与我完全相同。无法在网上找到有关此错误的任何信息。故事板参考似乎工作正常,但它们根本无法显示选项卡栏。而且,之前当一切都在主故事板中时,一切都工作正常。首先,我只想知道其他人是否可以让它发挥作用。顺便说一句,当查看单独的故事板文件中的导航控制器时,它们不会显示选项卡栏项目。这就像标签栏控制器看到了导航控制器的链接,但反之则不然。我不知道是否应该这样。我正在使用 Xcode 14.3.1。

ios storyboard uitabbarcontroller
1个回答
0
投票

分离代码/UI 可以帮助管理项目。

但是,也存在一些怪癖,特别是在使用多个故事板和故事板引用对象时。你已经成功击中了一个:)

“解决”这个问题的几种方法......


不要将 StoryBoard 引用连接到 TabBarController,而是创建一个自定义

UITabBarController
类并动态添加选项卡。

沿着这些思路:

struct MyTab {
    var sbName: String = ""
    var vcID: String = ""
    var tabName: String = ""
    var tabImg: String = ""
}

class MyTabBar: UITabBarController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        print(self, #function)

        let myTabs: [MyTab] = [
            MyTab(sbName: "FirstTabSB", vcID: "FirstNavC", tabName: "First", tabImg: "1.circle"),
            MyTab(sbName: "SecondTabSB", vcID: "SecondNavC", tabName: "Second", tabImg: "2.circle"),
        ]
        
        var vcs: [UIViewController] = []
        
        for (i, tb) in myTabs.enumerated() {
            let sb = UIStoryboard(name: tb.sbName, bundle: nil)
            let vc = sb.instantiateViewController(withIdentifier: tb.vcID)
            let tabItem = UITabBarItem(title: tb.tabName, image: UIImage(systemName: tb.tabImg), tag: i)
            vc.tabBarItem = tabItem
            vcs.append(vc)
        }
        
        self.viewControllers = vcs
    }
    
}

下一个选项 - 假设所有选项卡都是导航控制器(如您在问题中所述) - 像这样设置主故事板:

并让每个故事板中的初始视图控制器成为您想要作为每个导航控制器的“根”的 VC。

现在您可以正常配置选项卡项目(标题/图像/等)


下一个选项 - 将

TabBarItem
添加到每个“选项卡”故事板中的导航控制器:


请注意,在任何这些情况下,在 Storyboard 中使用视图控制器时,您都不会看到视图控制器底部的选项卡栏。尽管您可以从模拟指标中选择它:

© www.soinside.com 2019 - 2024. All rights reserved.