Storyboard初体验(转载)

Storyboard是iOS5的新特性。使用Storyboard可以更方便的管理应用的界面,同时为视图间的跳转提供了清晰的脉络。

任何时候你都可以在你的项目中添加Storyboard,不管你创建项目的时候有没有勾选“Usb Storyboard”选项,如下图所示。

如果你创建的时候勾选了该选项,那么恭喜你,你已经有了一个Storyboard,并且被设为了Main Storyboard,如下图所示。

同时你的代理类是这样的:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

return YES;

}

这跟以前可大不一样了!这是因为程序会自动加载Main Storyboard。如果你把上面的Main Storyboard项清空了,那我们的MainStoryboard.storyboard就是一个孤立的文件了,你必须手动加载它,所以上面的代码也得改一改,如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

self.window.rootViewController = [storyboard instantiateInitialViewController];

[self.window makeKeyAndVisible];

return YES;

}

上面加粗的两句比较重要,前一句是从文件创建UIStoryboard实例对象,后一句则是从这个对象里获取“初始视图控制器”(一个storyboard里只可以设置一个初始视图控制器,相当于这个storyboard的入口,后面还会说到)。 但如果你创建项目的时候没有勾选“Use Storyboard”项,那你就要手动添加Storyboard了,如下图所示。

手动创建的Storyboard和自动创建的没有任何不同,打开我们刚刚创建的Storyboard,里面什么都没有,我们不妨拖拽一个Navigation Controller到里面。

可以看到我们一次拖出了两个视图控制器,这是因为Navigation Controller需要一个rootViewController。注意我标注的两个小箭头,左边的代表这是一个“初始视图控制器”,右边的代表两个视图控制器之间的关系。选中视图控制器可查看属性。

取消勾选“Is Initial View Controller”后指向视图控制器的箭头也就消失了。再次说一下,一个Storyboard里只能有一个“初始视图控制器”。

下面要做的是在根控制器中添加一个button,然后继续拖拽一个ViewController,点击button新ViewController push进来。

首先添加button,就跟使用IB一样。这次我们拖拽一个UITabbarController,这时如下图所示。

接下来有两种方法: 第一种:我们可以直接在Storyboard中完成,按住ctrl从button连接到TabbarController,松开并选择push,这样我们就创建了一个segue(UISotryboardSegue)。

保存并运行

我们没有写任何代码就已经完成了一个简单的框架。

下面是第二种方法:我们准备用代码来实现。(记得把上一步中push类型的segue删除。)首先创建类FirstViewController(Subclass of UIViewController),然后将RootViewController的底层类改为FirstViewController,如下图。

继续选中TabbarController,并设置Identifier为“second”。

在FirstViewController.m中添加下面的方法并连接到button。

- (IBAction)pressed

{

UIStoryboard *board=[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

UITabBarController *nextViewController =[board instantiateViewControllerWithIdentifier:@"second"];

[self.navigationController pushViewController:nextViewController animated:YES];

}

加粗的代码展示了如何使用Identifier从Storyboard中获取指定的视图控制器。保存并运行,效果和前一种方法完全相同。

下面我们将完成另一个目标:手动触发一个segue。(Storyboard里无法创建一个通过touch来触发的segue。)

拖拽一个UIViewController,按住ctrl从TabbarController的第一个分支连接到新的viewController,同样选择push。

选择刚刚创建的segue并设置Identifier为“touch to push”,然后设置新viewController的Identifier为“third”。(Identifier只是一个名称没有实际意义,可以随便设置。)

添加新类SecondViewController(Subclass of UIViewController),选中第一个分支并设置其底层类为SecondViewController。然后添加如下方法。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

[self performSegueWithIdentifier:@"touch to push" sender:nil];

}

明白这个方法后就可以用任何类型的事件去触发我们在Storyboard中创建的segue了。

继续下一个目标:在segue被触发的时候传递参数到目标视图控制器。

删除TabbarController的第二个分支,拖拽一个UITableViewController,按住ctrl从TabbarController连接到UITableViewController,松开并选择relationship。选中cell设置Identifier为“cell”。然后再拖拽一个UIViewController,并添加一个UILabel。作如下操作。

添加类ThirdViewController(Subclass of UITableViewController)和类FourthViewController(Subclass of UIViewController),分别设置为最后两个视图控制器的底层类。

ThirdViewController.m

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return 20;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *identifier = @”cell“;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

if (cell == nil) {

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

}

cell.textLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];

return cell;

}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

//这里我很谨慎的对sender和目标视图控制器作了判断

if ([sender isKindOfClass:[UITableViewCell class]]) {

if ([segue.destinationViewController isKindOfClass:[FourthViewController class]]) {

NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

FifthViewController *nextViewController = segue.destinationViewController;

nextViewController.string = [NSString stringWithFormat:@"%d",indexPath.row];

}

}

}

FourViewController.h

@interface FifthViewController : UIViewController

{

IBOutlet UILabel *label;

}

@property (nonatomic,strong) NSString *string;

FourthViewController.m

@synthesize string;

- (void)viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

label.text = self.string;

}

segue包含属性sourceViewControllerdestinationViewController。segue在触发后但还未执行的时候会调用sourceViewController的prepareForSegue:sender:方法,sender是segue的起始点,可以是button、cell等等。这是你传递参数最好的时机,你可以利用sender参数来找到是哪个cell被点击,利用segue参数来获取源视图控制器对象和目标视图控制器对象,这样你就有足够的信息来传递参数了。

保存并运行

时间: 2024-11-06 13:35:29

Storyboard初体验(转载)的相关文章

Ubuntu 16.04 LTS 初体验 (转载)

一.前言 心血来潮,下载最新的Ubuntu Kylin 16.04尝鲜.但刚装完系统,还是有很多问题需要自己动手解决,这里就是把自己实际遇到的问题总结记录,希望也可以为其他刚接触 Ubuntu 的朋友提供一些帮助, 也欢迎大家补充.交流学习. 二.桌面使用引导 考虑到许多刚接触Ubuntu的朋友,对系统的使用做一些简单的引导. 三.系统设置  3.1 软件中心无法更新? 打开软件和更新面板后,修改下载服务器地址,然后选择其他站点(服务器可以随便自己选择,我选择了mirrors.sohu.com)

转:iOS7初体验(3)——图像资源Images Assets

开始之前,首先回顾一下iOS7初体验(1)——第一个应用程序HelloWorld中的一张图,如下所示: 本文分享一下Images.xcassets的体验~_~ 1. 打开此前使用过的HelloWorld项目,然后单击并打开导航区域中的Images.xcassets,看看都有些什么东东:]: 2. 在图中可以看到中间位置有两个虚线框,感觉应该可以直接拖文件进来.OK,那就先准备一下资源文件,如下图所示: 说明:为方便起见,除Icon7.png之外,其他图标的文件名均沿袭了以往iOS图标的命名规则.

iOS7初体验(3)——图像资源Images Assets

开始之前,首先回顾一下iOS7初体验(1)--第一个应用程序HelloWorld中的一张图,如下所示: 本文便分享一下Images.xcassets的体验~_~ 1. 打开此前使用过的HelloWorld项目,然后单击并打开导航区域中的Images.xcassets,看看都有些什么东东:]: 2. 在图中可以看到中间位置有两个虚线框,感觉应该可以直接拖文件进来.OK,那就先准备一下资源文件,如下图所示: 说明:为方便起见,除Icon7.png之外,其他图标的文件名均沿袭了以往iOS图标的命名规则

iOS7初体验(1)——第一个应用程序HelloWorld

iOS7 Beta已经发布了,迫不及待地下载了iOS 7及Xcode 5并体验了一下.先做一个简单的Hello World看看都有哪些变化吧. 1. 启动Xcode5-DP: 2. 从菜单选择File-New Project...,弹出如下窗口: 注意,在此多了一个SpriteKit Game的模板,暂时先不管它,还是选择熟悉的Single View Application,然后单击Next按钮: 3. 在接下来的对话框的Product Name输入框中输入:HelloWorld,如下图所示:

Java8初体验(二)Stream语法详解

原文链接:http://ifeve.com/stream/ 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的

Oracle SQL篇(一)null值之初体验

    从我第一次正式的写sql语句到现在,已经超过10年的时间了.我写报表,做统计分析和财务对账,我一点点的接触oracle数据库,并尝试深入了解.这条路,一走就是10年,从充满热情,到开始厌倦,我不知道我还能坚持多久,未来的路,谁知道呢? 也许是该抓紧时间,做一点什么了,我不知道该开始写些什么,我从来没有在网上写东西的习惯.     先从简单的开始吧,那当然就是SQL,这是我SQL系列的第一篇,希望我能够坚持. 在Oracle数据库中,如果一个表中的列没有值的话,我们可以说是空值,比如IT员

SSH初体验系列--Hibetnate--2--crud操作

Ok,今天比较详细的学习一下hibernate的C(create).R(read).U(update).D(delete) 相关api... 前言 Session: 是Hibernate持久化操作的基础,提供了众多的数据库操作方法,如save(),update(),delete()...etc,用于完成对象的增加,修改,删除等方法. 后面代码中使用到的HinernateUtil类:是用于构建SessionFactory(Hibernate提供的获取session的工厂类)的一个封装类,在前面的文

我是如何初体验uglifyjs压缩JS的

一.故事总有其背景 年末将至,很多闲适的时间,于是刷刷微博,接触各种纷杂的信息——美其名曰“学习”.运气不错,遇到了一个新名词,uglifyjs. 据说是用来压缩JS文件的,据说还能优化JS,据说是基于node的,还据说比Google Closure Compiler更带感,哦?激起了我的好奇心.百之谷之,哟,相关的介绍还不少.然后折腾了个把小时,基本上知道了是个怎么回事. 我觉得吧,还是有些用的,即使是不是从事node开发的人,抽个小空,share之,于是就有了本文.人总有浮躁的时候,我也不例

【尝新】微信小程序初体验

文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=1474644089434 根据文档地址中下载微信开发工具后,按照文档指引可以创建一个快速体验的小demo ,样例中的文件说明如下: 小程序包含一个描述整体程序的 app 和多个描述各自页面的 page. 一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下: app.js 是 小程序逻辑 app.json 是 小程序公共设置 app.wxss 否 小程序公共样式表 一个小程序页面由四个文