tabBarController管理多個Storyboard

一個tabBarController管理多個Storyboard

隨着項目的業務邏輯愈來愈複雜,隨着項目愈來愈大,那麼咱們Storybard中得控制器就愈來愈多, 就愈來愈難以維護。然而使用Storyborad又能更方便的幫助咱們作屏幕適配(PS:尤爲在六、6+出來後)。優化

咱們能夠將複雜的問題簡單化,經過建立多個Storyboard分別管理不一樣的模塊的方式來優化代碼,分紅兩步:好處:多個Storyboard能夠分開管理,一我的負責一起,提交代碼時不衝突;邏輯簡單,方便屏幕適配spa

  1. 按業務邏輯拆分Storyboard
  2. 在ApplicationDelegate中建立一個tabBarController,
    並將4個Storybard做爲子控制器添tabBarController。

廢話很少說直接上核心代碼:此處有4個Stroyboard(Home、Message、Discover、Profile),每一個Storyboard中都是initial對應的是導航控制器,導航控制器的根控制器是UIViewControllercode

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根本不關心子控制器如何操做,因此子控制器應該封裝在跟控制器中,子控制器的內容只讓根控制器決定。it

事例圖:io

pitcure

相關文章
相關標籤/搜索