V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
tunnyios
V2EX  ›  iDev

一个 tabBarController 管理多个 Storyboard

  •  1
     
  •   tunnyios ·
    chenzao1024 · 2015-07-15 00:03:12 +08:00 · 2659 次点击
    这是一个创建于 3422 天前的主题,其中的信息可能已经有所发展或是发生改变。
    随着项目的业务逻辑越来越复杂,随着项目越来越大,那么我们Storybard中得控制器就越来越多, 就越来越难以维护。然而使用Storyborad又能更方便的帮助我们做屏幕适配(PS:尤其在6、6+出来后)。

    我们可以将复杂的问题简单化,通过创建多个Storyboard分别管理不同的模块的方式来优化代码,分成两步:(PS:好处:多个Storyboard可以分开管理,一个人负责一块儿,提交代码时不冲突;逻辑简单,方便屏幕适配)
    1. 按业务逻辑拆分Storyboard
    2. 在ApplicationDelegate中创建一个tabBarController, 并将4个Storybard作为子控制器添加到tabBarController。

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

    // 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根本不关心子控制器如何操作,所以子控制器应该封装在跟控制器中,子控制器的内容只让根控制器决定。
    5 条回复    2015-07-17 09:44:10 +08:00
    tuimaochang
        1
    tuimaochang  
       2015-07-15 00:12:01 +08:00
    谢谢楼主分享
    tigerZhang
        2
    tigerZhang  
       2015-07-15 16:09:19 +08:00   ❤️ 1
    哇,你这是微博项目吧。
    fhefh
        3
    fhefh  
       2015-07-15 20:22:02 +08:00   ❤️ 1
    找到楼主在github发表的地址并收藏之(github上的排版好看一点,嘿嘿~)

    http://tunnyios.github.io/personal/tabBarController01/
    yfmir
        4
    yfmir  
       2015-07-16 16:21:22 +08:00
    感谢楼主,可以暂时把RBStoryboardLink 丟一边了
    rannie
        5
    rannie  
       2015-07-17 09:44:10 +08:00
    我是来看几个 StoryBoard 变量的名字的=、=
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3425 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:20 · PVG 19:20 · LAX 03:20 · JFK 06:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.