提问人:dominobuilder100 提问时间:9/5/2023 最后编辑:HangarRashdominobuilder100 更新时间:9/5/2023 访问量:24
如何将UITabBarController与多个故事板一起使用?
How to use UITabBarController with multiple storyboards?
问:
我刚刚在 Xcode 中创建了一个新项目。我的主情节提要文件包含一个选项卡栏控制器作为初始视图,以及五个链接到它的导航控制器(每个控制器都链接到一个单独的视图控制器)。我决定,为了提高工作效率,我应该为选项卡栏的五个部分中的每一个部分创建一个新的情节提要文件。我将选项卡栏控制器留在主情节提要中,并将其余部分移到他们自己的情节提要文件中。我使用情节提要引用将选项卡栏控制器链接到五个导航控制器,在主情节提要中,选项卡栏显示正确的图像和标题。但是,当我在模拟器或设备上运行应用程序时,选项卡栏突然不可见。我仍然可以单击选项卡来更改要在选项卡栏控制器中显示的导航视图,但它是不可见的。顺便说一句,到目前为止,我还没有在项目中添加任何代码。
我在带有选项卡栏控制器的单独情节提要文件上看到了多个教程,但它们的作用与我完全相同。无法在网上找到有关此错误的任何信息。故事板引用似乎工作正常,但它们根本无法显示选项卡栏。此外,在主故事板中出现所有内容之前,一切都运行良好。首先,我只想知道其他人是否可以让它工作。顺便说一句,在单独的情节提要文件中查看导航控制器时,它们不会显示选项卡栏项。这就像选项卡栏控制器看到指向导航控制器的链接,但看不到相反。我不知道是不是应该这样。我正在使用 Xcode 14.3.1。
答:
分离代码/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 中使用视图控制器时,您都不会看到视图控制器底部的选项卡栏。尽管您可以从“模拟指标”中选择它:
评论