随着项目的业务逻辑越来越复杂,随着项目越来越大,那么我们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. 电子科大POJ "任意阶矩阵相乘"

    任意阶矩阵的乘法 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) C-sourc ...

  2. UVA - 11020 Efficient Solutions(Multiset)

    本题利用multiset解决.根据题意,如果我们用P(x,y)表示一个人,因为人可以相同,所以用multiset.我们会发现,如果所有人群都是有优势的,那么这些点呈现一个递减的趋势.如果刚刚插入一个人 ...

  3. centos6.2+nginx-1.2.3+php-5.3.17安装脚本

    #!/bin/bash # # vm test install script # # create by xk # # data 2013-04-25 # # SOFTPATH=/home/tools ...

  4. 【机房系统知识小结点系列】之遍历窗体中的控件,判断Text是否为空?

    做机房系统时,几乎每个窗体中都会用到判断界面中的控件是否为空的情景.我们曾经是这样走来的: 第一版: 好处:对窗体界面中的Text等控件,逐一做判断,当用户输入某一项为空的时候,会议弹出框的形式,告诉 ...

  5. GDAL1.11版本号对SHP文件索引加速測试

    GDAL库中对于矢量数据的读取中能够设置一些过滤器来对矢量图形进行筛选.对于Shapefile格式来说.假设数据量太大,设置这个过滤器时间慢的简直无法忍受.好在GDAL1.10版本号開始支持读取Sha ...

  6. document load 与document ready的区别

    页面加载完成有两种事件 1.load是当页面所有资源全部加载完成后(包括DOM文档树,css文件,js文件,图片资源等),执行一个函数 问题:如果图片资源较多,加载时间较长,onload后等待执行的函 ...

  7. T-SQL存储过程

    存储过程(procedure)就是一个函数,完成一段sql代码的封装,实现代码的重用.    优点:         1.比使用DotNet直接写Sql脚本执行少了一块解析编译的过程.效率更快一点点. ...

  8. 取得网站的IP 地址

    select utl_inaddr.get_host_address('smtp.163.com') ipaddress from dual;

  9. 【MVC】过滤器

    APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这时候就用到了过滤器. MVC支持的过滤器 ...

  10. RouterOS(ROS)修改vrrp的mac地址