随着项目的业务逻辑越来越复杂,随着项目越来越大,那么我们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根本不关心子控制器如何操作,所以子控制器应该封装在跟控制器中,子控制器的内容只让根控制器决定。

一个tabBarController管理多个Storyboard的更多相关文章

  1. [Windows Phone]AnimationHelper管理分散的Storyboard

    问题描述: 在Windows Phone开发时候,可能存在这样的问题: 某一个控件需要一个特定的展现(这里假定是一个特定动画),那么我们会这么解决这个问题呢? 打开Blend,根据需求需求给控件添加动 ...

  2. 做一个阅读管理APP

    背景 由于最近在看的书有点多,所以一直想找一个能够管理阅读进度的书(鄙人记性不是很好,两天不看就忘了)可惜Android平台上一直找不到合适的APP: 有没有读书进度管理的网站或软件啊? 有没有记录读 ...

  3. 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享

    使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...

  4. SDWebImage使用——一个可管理远程图片加载的类库

    SDWebImage使用——一个可管理远程图片加载的类库     SDWebImage使用——一个可管理远程图片加载的类库 SDWebImage托管在github上.https://github.co ...

  5. npm 是node.js下带的一个包管理工具

    npm 是node.js下带的一个包管理工具          npm install -g webpack webpack是一个打包工具 gulp是一个基于流的构建工具,相对其他构件工具来说,更简洁 ...

  6. Spring Boot+Quartz实现一个实时管理的定时任务

    转载 https://www.cnblogs.com/wujiwen/p/9615120.html 项目实践过程中碰到一个动态管理定时任务的需求:针对每个人员进行信息的定时更新,具体更新时间可随时调整 ...

  7. ldconfig是一个动态链接库管理命令

    ldconfig是一个动态链接库管理命令 为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig ldconfig  命令的用途,主要是在默认搜寻目录(/lib和/usr/li ...

  8. 【教训】null == '',改造ThinkSNS 系统里面的一个缓存管理函数S()后,留下一个大bug

    本来想简化 ThinkSNS 系统里面的一个缓存管理函数: <?php /** * 用来对应用缓存信息的读.写.删除 * $expire = null/0 表示永久缓存,否则为缓存有效期 */ ...

  9. ubuntu问题: 同时只能有一个软件管理工具在运行

    或者是: 只能同时运行一个更新管理器 打开终端输入命令:sudo dpkg –configure -a 运行,系统问题就解决了

随机推荐

  1. Hadoop--Hadoop的机架感知

    Hadoop的机架感知 Hadoop有一个“机架感知”特性.管理员可以手工定义每个slave数据节点的机架号.为什么要做这么麻烦的事情?有两个原因:防止数据丢失和提高网络性能.     为了防止数据丢 ...

  2. 【LeetCode练习题】Next Permutation

    Next Permutation Implement next permutation, which rearranges numbers into the lexicographically nex ...

  3. Sonar入门(二): Maven集成Sonar

    Sonar对maven提供了简单可配的支持,要做的事情很简单——在maven/conf下settings.xml <profiles></profiles>标签之间添加如下内容 ...

  4. 将常见对象转换成json字符串

    public class JsonUtil { public static String objectTojson(Object obj) { StringBuilder json = new Str ...

  5. Sereja and Suffixes(思维)

    Sereja and Suffixes Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64 ...

  6. android典型监听事件实

    public class MainActivity extends Activity { int counter; Button add, sub; TextView display; @Overri ...

  7. php正则表达式匹配函数

    <?php function show($var=null){ if(empty($var))  { echo 'null'; }else if(is_array($var) || is_obj ...

  8. ios百度地图不能定位问题

    在IOS8中定位功能新增了两个方法: - (void)requestWhenInUseAuthorization __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE ...

  9. UVa 1583 - Digit Generator

    A+A的每一位的数字的和=B 问你每一个B对应 的最小的A 是多少 不然输出0: #include <cstdio> #include <iostream> #include ...

  10. linux下的gdb调试工具--内存调试

    接着上一节的代码,在while(1)的循环里面增加代码:sum=0 #include <stdio.h> int main(void) { int sum = 0, i = 0; char ...