一个tabBarController管理多个Storyboard

本文介绍了一种使用多个Storyboard来组织大型iOS应用的方法,通过分解复杂的业务逻辑为不同的模块,提高代码可维护性并简化屏幕适配工作。文章详细展示了如何在AppDelegate中创建并配置UITabBarController来管理多个Storyboard。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着项目的业务逻辑越来越复杂,随着项目越来越大,那么我们Storybard中得控制器就越来越多, 就越来越难以维护。然而使用Storyborad又能更方便的帮助我们做屏幕适配(PS:尤其在6、6+出来后)。

我们可以将复杂的问题简单化,通过创建多个Storyboard分别管理不同的模块的方式来优化代码,分成两步:好处:多个Storyboard可以分开管理,一个人负责一块儿,提交代码时不冲突;逻辑简单,方便屏幕适配

  1. 按业务逻辑拆分Storyboard
  2. 在ApplicationDelegate中创建一个tabBarController,
    并将4个Storybard作为子控制器添tabBarController。

废话不多说直接上核心代码:此处有4个Stroyboard(Home、Message、Discover、Profile),每个Storyboard中都是initial对应的是导航控制器,导航控制器的根控制器是UIViewController

AppDelegate.m

// 1.创建Window
self.window = [[UIWindow alloc] initWithFrame:ACScreenBounds];
self.window.backgroundColor = [UIColor whiteColor];
// 2.创建TabBarCongtroller
UITabBarController *tb = [[UITabBarController alloc] init];
// 3.加载4个Storyboard
UIStoryboard *homeSB =[UIStoryboard storyboardWithName:@"Home" bundle:nil];
UIStoryboard *messageSB =[UIStoryboard storyboardWithName:@"Message" bundle:nil];
UIStoryboard *discoverSB =[UIStoryboard storyboardWithName:@"Discover" bundle:nil];
UIStoryboard *profileSB =[UIStoryboard storyboardWithName:@"Profile" bundle:nil];

//3.5 设置tabBarItem
UINavigationController *homeNav = [homeSB instantiateInitialViewController];
UIViewController *homeVc = homeNav.topViewController;
homeVc.title = @"首页";

UINavigationController *messageNav = [messageSB instantiateInitialViewController];
UIViewController *messageVc = messageNav.topViewController;
messageVc.tabBarItem.title = @"消息";
messageVc.tabBarItem.image = [UIImage imageNamed:@"1"];

// 4.创建并将4个Storyboard添加到TabBarCongtroller中
tb.viewControllers = @[homeNav,
                       messageNav,
                       discoverSB.instantiateInitialViewController,
                       profileSB.instantiateInitialViewController
                       ];
// 5.设置根控制器
self.window.rootViewController = tb;
// 6.显示Window
[self.window makeKeyAndVisible];

代码中需要注意的

  • tabBarItem的title和image必须在拿到实例后设置才能显示
  • tabBarItem的title和image只能在继承自UIViewController的控制器才能设置
  • 将子控制器添加到tabBarController中时,一定要添加实例设置后的控制器,如果直接添加类似于这个的discoverSB.instantiateInitialViewController,将不能显示title和iamge

/*

 此外还应注意不能这样设置:
 UIViewController *homeVc = [homeSB instantiateViewControllerWithIdentifier:@"home"];
 homeVc.title = @"首页";
 tb.viewControllers = @[homeSB.instantiateInitialViewController];

 因为homeVc和 [homeSB instantiateInitialViewController].topViewController 指向的不是同一片内存地址,因此设置不会生效。

*/

代码优化

以上就是一个tabBarController来管理多个Storyboard的方法。还可以把上面的创建tabBarController封装到一个自定义的UITabBarController中,达到优化的效果,将代码放到它改存在的位置。因为这些子控制器是归根控制器来管理的Application根本不关心子控制器如何操作,所以子控制器应该封装在跟控制器中,子控制器的内容只让根控制器决定。

转载自:https://segmentfault.com/a/1190000002995318

<think>我们参考了用户提供的引用内容,特别是引用[1]和引用[2]中关于如何将视图控制器嵌入到Tab Bar Controller的步骤,以及引用[3]中关于Tab Bar Controller的结构和连接方式。 用户的问题:如何在Storyboard中使用Tab Bar Controller实现多个模块之间的切换? 我们将按照以下步骤进行说明: 1. 创建Tab Bar Controller并设置为初始控制器(如果需要) 2. 添加多个视图控制器(每个模块一个) 3. 将视图控制器连接到Tab Bar Controller作为子控制器 4. 配置每个子控制器的Tab Bar Item(图标和标题) 5. 关联自定义类(如果需要) 具体步骤: 步骤1:创建Tab Bar Controller - 如果项目已经有一个初始的ViewController,可以将其嵌入到Tab Bar Controller中(如引用[1]和[2]所述)。 - 打开Storyboard,选中当前的初始视图控制器(或任意一个你想作为第一个标签页的视图控制器),然后点击顶部菜单栏的Editor -> Embed In -> Tab Bar Controller。这样就会创建一个Tab Bar Controller,并将选中的视图控制器作为它的第一个子控制器。 步骤2:添加其他视图控制器 - 从对象库(Object Library)中拖拽新的视图控制器(View Controller)到画布上。每个视图控制器代表一个模块(标签页)。 步骤3:将视图控制器添加到Tab Bar Controller - 按住Control键,从Tab Bar Controller拖动到新添加的视图控制器上,释放鼠标。 - 在弹出的菜单中选择“Relationship Segue”下的“view controllers”(注意:是复数形式,表示添加到现有的子控制器数组中)。 - 重复此步骤,添加所有需要的视图控制器。 步骤4:配置每个标签页的Tab Bar Item - 选择每个子视图控制器,在它的Tab Bar Item(位于视图控制器底部的栏上)的属性检查器(Attributes Inspector)中设置: - System Item:可以选择系统提供的图标和标题(如Favorites、Search等) - 或者自定义: - Title:标签标题 - Image:标签图标(需要提前将图片资源添加到Assets中) 步骤5(可选):关联自定义类 - 如果某个模块需要自定义逻辑,可以为对应的视图控制器创建新的类(继承自UIViewController或UITableViewController等),然后在Storyboard中选中该视图控制器,在Identity Inspector中设置Class为自定义的类。 步骤6:设置初始控制器 - 如果希望Tab Bar Controller作为应用的入口,确保Tab Bar Controller被设置为初始视图控制器(即其左侧有一个箭头指向它)。如果没有,可以选中Tab Bar Controller,然后在属性检查器中勾选“Is Initial View Controller”。 示例图(由于无法显示图片,用文字描述): - 在Storyboard中,Tab Bar Controller会显示一个带有底部Tab Bar的视图控制器,并且有多个指向其他视图控制器的关系连线(每个连线代表一个标签页)。 代码示例(如果需要通过代码创建,但用户要求Storyboard实现,所以以下仅供参考): - 通常,使用Storyboard不需要编写代码来创建Tab Bar Controller和子控制器。但如果有特殊需求(比如根据条件动态显示不同的标签页),可以在AppDelegate中处理。 注意:每个子视图控制器都可以独立设计界面,并且可以有自己的导航控制器(如果需要导航功能,可以再嵌入到Navigation Controller中)。 下面是一个简单的步骤总结: 1. 创建Tab Bar Controller:通过Embed In方式创建,或直接从对象库拖拽一个Tab Bar Controller到画布。 2. 添加子控制器:通过Ctrl+拖动建立“view controllers”关系。 3. 配置每个标签页的标题和图标。 4. 设置初始控制器(如果需要)。 这样,运行应用后,底部就会出现Tab Bar,点击不同的标签即可切换模块。 相关问题: 1. 如何在Tab Bar Controller中嵌套导航控制器? 2. 如何通过代码动态添加或删除标签页? 3. 如何自定义Tab Bar的外观? 4. 如何在不同标签页之间传递数据? 5. 如何监听标签页的切换事件? 我们根据用户的问题,重点回答了在Storyboard中如何设置,并提供了步骤。</think>### 在Storyboard中使用Tab Bar Controller实现多模块切换 以下是详细操作步骤,结合引用内容实现多模块切换: #### 核心步骤 1. **创建Tab Bar Controller** - 打开Storyboard,从对象库拖入`Tab Bar Controller` - 选中控制器 → 属性检查器 → 勾选 `Is Initial View Controller`(设置为主入口)[^3] 2. **添加子模块控制器** ```mermaid graph LR A[Tab Bar Controller] --> B[模块1 View Controller] A --> C[模块2 View Controller] A --> D[模块3 View Controller] ``` - 从对象库拖入多个`View Controller`(每个代表一个模块) - **关键操作**:按住`Ctrl`从Tab Bar Controller拖向子控制器 → 选择 `Relationship Segue` → `view controllers`[^3] 3. **配置模块标识** - 选中子控制器的`Tab Bar Item` → 属性检查器: - `System Item`:选择系统图标(如Favorites/History) - 或自定义: - `Title`:设置模块名称(如"首页") - `Image`:设置图标(需提前导入图片资源) 4. **关联自定义类(可选)** - 为每个子控制器创建对应的.swift文件: ```swift class HomeVC: UIViewController { /* 模块1代码 */ } class ProfileVC: UIViewController { /* 模块2代码 */ } ``` - 在Storyboard中选中控制器 → Identity Inspector → 设置`Class`为自定义类名 #### 高级配置 1. **嵌套导航控制器** - 选中子控制器 → `Editor > Embed In > Navigation Controller` - 此时Tab Bar将显示带导航栏的模块(支持返回按钮)[^3] 2. **动态控制模块** ```swift // 代码切换当前模块 tabBarController?.selectedIndex = 1 // 切换到第2个模块 // 动态添加模块 let newVC = UIStoryboard(name: "New", bundle: nil).instantiateInitialViewController() tabBarController?.viewControllers?.append(newVC) ``` #### 效果验证 运行应用后: - 底部显示Tab Bar导航栏 - 点击不同图标切换模块视图 - 支持滑动切换(需开启`interaction`属性) > ⚠️ 常见问题解决: > - **图标不显示**:检查图片尺寸(推荐30x30@2x/3x) > - **布局错位**:确认未在Tab Bar Controller添加额外约束 > - **点击无响应**:检查Relationship Segue是否连接正确
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值