多人多Storyboard开发

小引

最近,经常在 iOS 开发交流群里面看到有人在讨论关于屏幕适配的问题。我之前也写过几篇关于利用AutoLayout来做屏幕适配的文章《AutoLayout之可视化布局》《AutoLayout之纯代码布局》,讲的虽然比较基础,但都是可以很好的帮助初学者掌握AutoLayout。

说到屏幕适配,就不得不提Storyboard。虽然,还是有很多人在坚持使用纯代码,但是Size Class的出现就足够引起你对Storyboard的重视了,在使用Size Class时,一个Storyboard相当于九个Storyboard,你可以在这里处理各种屏幕的适配。

如果你还不会使用Storyboard,你可以看看这篇文章《在iOS 7中使用storyboard》。

不知道现在是否还有人在说,使用Storyboard最大的弊端在于不利于多人开发。那么本文将向你讲解一下如何在一个项目中使用多个Storyboard来进行多人开发。也许看完本文,你也会爱上Storyboard的。


正文

最终效果

下面我主要通过搭建一个大家最常见的UITabbarController和UINavigationController嵌套使用的项目来讲解一下,如何在一个项目中使用多个Storyboard。

项目的最终效果如下图:

image

说明一下,项目中使用的图标是新浪微博客户端里面的,模仿了一下新浪微。
项目目录结构大家也可以看下:

image


API介绍

其实,使用多Storyboard开发还是很简单的,只是很多人没有尝试过,不知道该如何下手。这里我先提一下我们会用到的主要API,如下:

1
2
3
4
5
6
+ (UIStoryboard *)storyboardWithName:(NSString *)name
bundle:(NSBundle *)storyboardBundleOrNil

- (id)instantiateInitialViewController

- (id)instantiateViewControllerWithIdentifier:(NSString *)identifier

API说明:

  • + (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(NSBundle *)storyboardBundleOrNil是加载Storyboard的方法,需要注意的是,它仅仅是加载名字为name的Storyboard,并不会创建Storyboard中的控制器和控件。
  • - (id)instantiateInitialViewController返回第一个界面(根视图所在界面),每个Storyboard都必须有一个入口界面,也就是Storyboard的第一个界面,肉眼可见的就是,会有个箭头在这个控制器前面,如下图所示的Navigation Controller。

image

图中还有一处标示:Is Initial View Controller,读者可以试下勾选和去掉的区别,这个操作就可以自己设置Storyboard的根控制器啦。

  • - (id)instantiateViewControllerWithIdentifier:(NSString *)identifier根据identifier获取Storyboard中对应的控制器,identifier的设置如下图,这个一定要设置,否则在使用该方法时会报‘Storyboard doesn’t contain a view controller with identifier ‘xxx’’的错误。此方法可以动态的加载Storyboard里面的任何一个控制器。

image


实战项目

如何创建新的Storyboard

选择你要创建Storyboard的目录,然后command + n,选择User Interface再选Storyboard,命名好回车即可。

image

创建好了之后,直接拖一个控制器到Storyboard里面,并选中该控制器,勾选Is Initial View Controller。


项目核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self setup];
}
- (void)setup
{
self.tabBar.translucent = NO;
self.tabBar.tintColor = [UIColor colorWithRed:1.0f green:130/255.0f blue:0 alpha:1.0f];
[self addChildVcWithStoryboardName:@"Home"
title:@"首页"
icon:@"tabbar_home"
selIcon:@"tabbar_home_selected"];
[self addChildVcWithStoryboardName:@"Message"
title:@"消息"
icon:@"tabbar_message_center"
selIcon:@"tabbar_message_center_selected"];
[self addChildVcWithStoryboardName:@"Discover"
title:@"发现"
icon:@"tabbar_discover"
selIcon:@"tabbar_discover_selected"];
[self addChildVcWithStoryboardName:@"Profile"
title:@"我"
icon:@"tabbar_profile"
selIcon:@"tabbar_profile_selected"];
}
- (void)addChildVcWithStoryboardName:(NSString *)storyboardName
title:(NSString *)title
icon:(NSString *)icon
selIcon:(NSString *)selIcon
{
/* 加载名为storyboardName的Storyboard */
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
/* 获取storyboard的InitialViewController 即根控制器*/
UIViewController *vc = [storyboard instantiateInitialViewController];
/**
* 设置UIImage的渲染方式。因为按钮的颜色是纯色的,所以上面直接设置 tabBar 的
* tintColor 即可设置图片选中时的颜色,所以没有使用图片渲染的方式。如果选中图片不
* 止一种颜色,可以使用图片渲染的方式。注意:两者只能选择一种,否则只会显示 tintColor
* 的颜色
* UIImage * normalImage = [[UIImage imageNamed:icon] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
* UIImage * selectImage = [[UIImage imageNamed:selIcon] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
*/
/* 设置tabbarItem的标题、默认图片以及选中时的图片 */
vc.tabBarItem = [[UITabBarItem alloc] initWithTitle:title image:[UIImage imageNamed:icon] selectedImage:[UIImage imageNamed:selIcon]];
/* 添加子控制器 */
[self addChildViewController:vc];
}
@end

项目已上传至Github:下载


小结

以上就是关于多人多Storyboard开发的介绍。其实,只要学会如何加载Storyboard和获取Storyboard里面的控制器即可。接下来就是各自管理各自使用的Storyboard,这样就会避免引起不必要的冲突。另外,像Images.xcassets这样的文件,你也可以创建多个不同的xcassets文件来各自管理项目中使用的图片。


你可能感兴趣的文章


原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0