随着项目的业务逻辑越来越复杂,随着项目越来越大,那么我们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. Vis.js图表插件

    Vis.js是一款基于JavaScript的可视化图表库,Vis.js不像其他的图表库那样仅仅支持几种常用的数据图表,比如线形图.柱状图.饼图等,Vis.js支持上百种不同类型的可视化图表类型,比如时 ...

  2. 升级Xcode7后所要更改的配置

    http://blog.csdn.net/huxiaoqiao163/article/details/48711077

  3. HDU 1852 Beijing 2008 数论

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1852 这道题和HDU1452类似. 题意:给你一个n.k,让你求2008^n所有因子的和(包括1和本 ...

  4. javascript第十五课:DOM

    dom就是文档,就是整个网页的简称,dom里面的标签就是对象 使用javascript进行DHMTL网页开发(Dynamic Html 动态网页) dom就是把html页面模拟成一个对象,顶级对象wi ...

  5. 彩虹vpn免费10分钟

    账号:rainbowvpn password:10fenzhong server地址:t.chqvpn.com l2tp密钥:123456

  6. javascript设计模式——Module

    Module模式是提供公有和私有方法的代码块,有利于封装组织代码,可减少变量及函数名与其它模块的冲突. 推荐阅读: http://www.adequatelygood.com/JavaScript-M ...

  7. 关于HTML css的一些题目

    1.dcutype是什么,他是干嘛用的 doctype是文档的一种声明,告诉浏览器器用什么规则来解析文档. 2.ul ol dl分别适用于什么地方? ul无序列表 ol有序列表 dl是定义列表,会默认 ...

  8. Android学习之listview的下拉刷新、上拉载入

    本例是在上例的基础上完成的.本例实现的listview上拉载入.下拉刷新功能,是在开源网站上别人写好的listview,主要是对listview的控件进行重写,添加了footer和header. 1. ...

  9. Hadoop 安装(3) JDK 的安装

    使用vsftp上传,JDK 和 Hadoop 到 Hadoop 用户目录. 安装JDK root 身份登录Slave4.Hadoop,在 /usr 下创建 "Java"文件夹,将j ...

  10. C#4 for循环 迭代法 穷举法应用

    for()循环. 四要素: 初始条件,循环条件,状态改变,循环体. 执行过程: 初始条件--循环条件--循环体--状态改变--循环条件.... 注意:for的小括号里面分号隔开,for的小括号后不要加 ...