StoryBoard的初步学习
最近看了一些用storyboard做的小demo觉得,storyboard有种很清晰的感觉,页面之间的切换很有层次感,直接在一个文件中显示所有视图的联系。较之以前的xib或者手写代码看起来轻松了很多,只需要进行一些连线就能实现原来需要一大段的代码才能实现的东西。
好了,下面开始我们的正题。新建一个singleview application。打开appdelegate.h文件,如下
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
有没有发现,window的输出口不见了,没了原来的IBOutlet了。
同样,代开.m文件,你会更加讶异application:didFinishLaunchingWithOptions: 方法, 也只不过简单的返回了一个YES。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
return YES;
}
那么它是如何实现初始时的加载呢?
答案就在.plist文件中
在以前用xib创建的工程中,此处是NSMainNibFile,它会告诉UIApplication去加载mainwindow.xib。而现在会直接加载MainStoryBoard.storyboard,进而实例化出第一个视图控制其对象,然后将所有视图加载带UIWindow上。
接下来我们来小小实践一下,打开storryboard文件,你会看到
左边的箭头代表初始的视图控制器,也就是以前的rootviewcontroller,在这里,我们将这个视图控制器删掉,添加一个TabbarController,然后将箭头移至这个视图上。然后依次添加TableviewController。最后结果是这样的
再添加一个tableviewcontroller时,最好用NavigationController来控制,操作方法是选中某个tableviewcontroller,然后选择菜单栏editor-》e'mbed-》NavgationController
某两个视图要建立起联系的时候,可以在某个视图上按住control然后拖到另外一个视图选择相应选项。
在视图都建立完成之后,就为每个视图添加相应的类,当然tabbarController以及表视图的导航器可以不用添加。最关键的一步,如下图所示
一定要为相应的视图改为某个类的实例。
下面讲讲TableViewCell,这个可能和以前xib时,大不相同。
,这里假设某个cell的style为SubTitle。
在相应的数据源的
方法中你只需做如下操作- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
|
Identifier保持与上面截图一致即可。
如果当前没有可以重复使用的单元格, 这里将会自动创建一个新的原型单元格,并且返回给你。 你要做的仅仅是提供一下你在Storyboard编辑器中为这个原型单元格指定的重用标识(Reuse Ifentifier), 在我们这个项目中就是 “PlayerCell”。 一定不要忘记设置这个标识,否则这个就不能正常工作了。
和xib一样,你也可以新建一个继承Cell的类,和上面一样
为相应的cell改成某个类的实例。
继续,来认识下Segue.(读作seg-way)
Segue简单来说是视图间的联系,也就是图上的箭头连线。当你想要将某个视图跳转时将本身的数据传递给目的视图控制器的时候,可以调用这个方法
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
这里是在两个 scene(即视图控制器) 之间建立连接的步骤(一般采用代理模式)。
- 在源 scene 中的按钮或其他控件上创建 segue 到目标 scene。(如果你想用模态的方式展现新界面, 那么一般目标应该是 Navigation Controller)
- 为 segue 设置一个唯一标识。(它仅仅需要在源 scene 中唯一, 不同的 scene 可以用同样的标识名),即上面截图所示。
- 为目标 scene 创建代理协议。
- 让源 Scene 实现代理协议。 它应该在某个按钮按下的时候关闭目标控制器。
- 在源 Scene 中实现 prepareForSegue 方法, 在这里设置 destination.delegate = self; 。
Segue 只能是单向的, 他们只能用于打开一个新界面。 如果要返回或者关闭界面(或者从导航控件的栈中弹出),通常都是用代理来做的。 Segue 仅仅听从于源控制器, 而目标控制器甚至都不知道自己是被 Segue 打开的。
嗯,所有的工作到此结束,相信对storyboard有一定的了解了,那么赶紧动起来,实践吧!
环境:Xcode5,MAC Os X 10.8.4
demo地址:demo
参考资料:Ray Wenderlich
尊重他人劳动成果,转载请注明出处。谢谢!