Storyboard初体验
2019独角兽企业重金招聘Python工程师标准>>>
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包含属性sourceViewController和destinationViewController。segue在触发后但还未执行的时候会调用sourceViewController的prepareForSegue:sender:方法,sender是segue的起始点,可以是button、cell等等。这是你传递参数最好的时机,你可以利用sender参数来找到是哪个cell被点击,利用segue参数来获取源视图控制器对象和目标视图控制器对象,这样你就有足够的信息来传递参数了。
保存并运行
暂时就摸索了这么多,下面是项目文件:
http://ryan.easymorse.com/wp-content/uploads/2012/01/StoryNav.zip
转载于:https://my.oschina.net/u/728866/blog/92707
Storyboard初体验相关推荐
- Swift与C++混编 OpenCV初体验 图片打码~
OpenCV初体验,给图片打码 提到OpenCV,相信大多数人都听说过,应用领域非常广泛,使用C++开发,天生具有跨平台的优势,我们学习一次,就可以在各个平台使用,这个还是很具有诱惑力的. 本文主要记 ...
- iOS7初体验(1)——第一个应用程序HelloWorld
iOS7 Beta已经发布了,迫不及待地下载了iOS 7及Xcode 5并体验了一下.先做一个简单的Hello World看看都有哪些变化吧. 1. 启动Xcode5-DP: 2. 从菜单选择File ...
- 苹果电脑安装python3密码_mac系统安装Python3初体验
前沿 对于iOS开发不要随便拆卸系统自带的Python,因为有很多 library 还是使用 Python2.7. 1 安装Xcode 1.1 App Store 搜索Xcode 并安装 1.2 安装 ...
- MapReduce编程初体验
需求:在给定的文本文件中统计输出每一个单词出现的总次数 第一步: 准备一个aaa.txt文本文档 第二步: 在文本文档中随便写入一些测试数据,这里我写入的是 hello,world,hadoop he ...
- 小程序 缩放_缩放流星应用程序的初体验
小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...
- wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验
wxWidgets刚開始学习的人导引全文件夹 PDF版及附件下载 1 前言 2 下载.安装wxWidgets 3 wxWidgets应用程序初体验 4 wxWidgets学习资料及利用方法指导 5 ...
- 用鸿蒙跑了个 “hello world”!鸿蒙开发初体验
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源 | https://my.oschina.net/u ...
- Windows Embedded Standard开发初体验(二)
支持Silverlight的Windows Embedded Standard 好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了.在开始菜单中 ...
- 深度探索Hyperledger技术与应用之超级账本初体验(附部署代码)
2019独角兽企业重金招聘Python工程师标准>>> 本章零基础地介绍了如何快速体验超级账本搭建的区块链网络,我们先绕过了比较复杂的初始化配置,用官方提供的fabric-sampl ...
最新文章
- qmail+spamassassin启用spf过滤
- 现在流行的源程序版本管理软件和项目管理软件
- 解题报告——例题5-5 集合栈计算机 UVa12096
- linux 递归修改所有权限
- 百度地图API : 自定义标注图标
- bat 存储过程返回值_为什么不推荐使用存储过程?
- 小米MIX 4要来了?这硬件“堆”的也是没谁了 全是最新技术
- js html json 压缩工具,JS格式化/压缩JSON数据
- Conflux的自我进化:从DAG到树图| 对话伍鸣
- 位运算符最详细的解释(java)
- 今日春分|春生美好,万事可期
- O2O商城系统,适合本地电商发展的商城系统!
- [开关电源]浪涌电流有点高?我来给你支支招
- Storm学习(一)Storm介绍
- 一个关于APP开发者的复兴之路 区块连
- USB协议详解第3讲(USB描述符-设备描述符)
- Python 决策树预测 分类算法
- dz论坛数据库php网址,discuz论坛更换域名,搬家步骤
- 7-13 查找奥运五环色的位置 (10分)
- 工业级成熟航运港口人工智能产品全球前三船公司及港口码头落地,中国上海人工智能独角兽中集飞瞳全球应用最广规模最大最先进港航AI企业
热门文章
- opencv python 从摄像头获取视频、帧率、分辨率等属性设置和使用
- spring中的单例工厂SingletonBeanRegistry设计与实现
- python中的迭代库
- 题目1019:简单计算器
- elk7.2+filebeat
- vue2.0组件生命周期探讨
- 云如何让App开发更简单?
- STM32接口FSMC/FMC难点详解
- controller实现pdf的下载功能
- MySQL----ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes