Storyboard初体验

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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参数来获取源视图控制器对象和目标视图控制器对象,这样你就有足够的信息来传递参数了。

保存并运行

转载于:https://my.oschina.net/u/874588/blog/98295

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络地址 子网掩码 广播地址计算

已知一个ip地址是192.168.1.1,子网掩码是255.255.255.0,那么它的网络地址是多少? 192.168.1.0 已知某主机的ip地址是192.168.100.200,子网掩码为255.255.255.192,其网络内可用的ip地址个数为多少 62 1111 1111 1111 …

linux服务之DHCP

转自:http://best0.blog.51cto.com/444987/104151用Linux做DHCP服务器,原理跟在windows环境下、路由器上做DHCP相同,所以不在这里介绍了。我们直接开始配置dhcp服务器。这次介绍用Linux配置DHCP服务器,我以实验理论的方式介绍&…

Oracle RAC更改VIP IP地址_2节点的实验

本文转载:http://space.itpub.net/9664900/viewspace-676800 1、主机名规划: --更改前: #Public Network - (eth0) 192.168.10.11 rac1 192.168.10.12 rac2 #Private Interconnect - (eth1) 10.10.10.11 rac1priv 10.10.10.12 ra…

模板全特化和偏特化用法

#include <iostream> template <typename T, typename U> class TC { public: TC() { std::cout << "泛化版本构造函数" << std::endl; } void funtest() { std::cout << "泛化版本成员函数…

IIS Express 使用详细说明

最近在使用XP的IIS发布Asp.Net MVC3的项目&#xff0c;但是发现一个很头疼的一个问题&#xff0c;在IIS指定虚拟目录来发布网站发布不了&#xff0c;以前发布Webfrom项目则不会有这样的问题&#xff0c;应该是跟路由路径有关系&#xff0c;导致每次都是从网站根节点算起&#x…

qt项目转vs项目

先执行一下命令&#xff1a; call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat" SET "PATHD:\soft_install\qtcreator\5.12.10\msvc2017_64\bin;%PATH%" pause 执行完以上命令之后&#xff0c;再…

离奇的xenapp客户端无法加载应用故障解决过程 ...

新建的xenapp 6.5 for 2008 简体中文版&#xff0c;弄好之后从客户端去访问&#xff0c;结果报错&#xff08;当时忘了截图下来&#xff09;&#xff0c;大致意思就是说服务器无法处理我的请求。确认安装过程正确&#xff0c;程序发布正常。排查过程发现通过RDP的远程桌面可以加…

时间管理,从洗碗开始

笔者的前一篇博文《你是怎么利用时间的&#xff1f;》&#xff0c;自发表后得到了一些读者的关注和好评。更有甚者&#xff0c;博友shyy8712872还进一步发表了博文《老生常谈的时间你真的管理好了吗&#xff1f;》&#xff0c;并在其中引用了我的原话。这都令笔者深感欣慰、荣幸…

ADDS学习(下)

任务三&#xff1a;完成活动目录备份和恢复 1) 验证第一部分用户和OU是否存在 2) 备份活动目录 3) 删除一个OU 4) 恢复 5) 验证恢复是否成功 如下图&#xff0c;qingfeng.com域中有OU和用户&#xff0c; 要备份活动目录&#xff0c;使用微软的windows server backup工具&#x…

linux下boost库链接动态库失败

echo "boost库lib安装路径" >>/etc/ld.so.conf 加入动态库的地方 执行动态库命令 sudo ldconfig

一些Web Service的经验

使用Web服务也有半年多了&#xff0c;虽然时间不长&#xff0c;但还是遇到了不少难题&#xff0c;在这里把我的一些经验拿出来给大家共同分享。 刚开始做Web服务的时候还觉得很轻松&#xff0c;感觉就跟写一般的组件没什么区别&#xff0c;而使用时跟引用普通的程序集一样的简单…

递归1

此次做项目使用JDBC&#xff0c;遇到了一个树形结构&#xff0c;采用递归查找父类&#xff0c;有了一个初步的认识。 public Channel findParent(int id){ if (id0) { return null; }else { int parent 1; Channel cnew Chan…

ssh 脚本 空格字符转换

yum install -y doc2unix && doc2unix *.sh

⑨④-如果不发展就可能面临生存窘境

⑨④-如果不发展就可能面临生存窘境 老男孩语录⑨④-如果不发展就可能面临生存窘境 现实很残酷&#xff0c;如果你不去思考如何发展自己&#xff0c;就可能面临生存的窘境&#xff01; 上面这句话不光适合某一个个体人类&#xff0c;小到一个家庭&#xff0c;一个公司&#xff…

探究make_shared效率

Why Make_shared ? C11 中引入了智能指针, 同时还有一个模板函数 std::make_shared 可以返回一个指定类型的 std::shared_ptr, 那与 std::shared_ptr 的构造函数相比它能给我们带来什么好处呢 ? 优点 效率更高 shared_ptr 需要维护引用计数的信息, 强引用, 用来记录当前…

vs2012里用easyUI,显示不正常

vs2012里用easyUI&#xff0c;显示不正常&#xff0c;什么时候可以解决转载于:https://www.cnblogs.com/zhangxj/archive/2013/01/05/2846235.html

asp.net实现ftp上传代码(解决大文件上传问题)

原来使用asp.net上传控件上传 那个虽然简单但是页面不是很友好 然后就用了uploadify上传控件 这个控件虽然界面友好 但是大文件还是不能上传 而且在不同的浏览器会出现session丢失问题 所以我到了个ftp上传的方法 以下是具体代码 View Code?11 using System; 2 using System…

关于豆瓣电台收费的思考

大家讨论的热火朝天啊大家的问题&#xff1a;电台的盈利模型是不是只有广告我觉得电台的盈利只靠广告是不行的&#xff0c;所谓电台就是主要是多播和广播&#xff0c;是相对传统电台来的。传统电台涉及硬件成本低。广告可以&#xff0c;互联网电台依靠广告盈利&#xff0c;除非…

做自己的伯乐

读很多古代大家的故事&#xff0c;就发现贾谊、苏轼、李白等人生不逢时&#xff0c;怀才不遇&#xff0c;不被帝王将相所识并所用&#xff0c;实现自己的政治抱负。笔者细观周围好多朋友和同事&#xff0c;在一起聚会时&#xff0c;常常也发出类似的慨叹&#xff0c;刨去当前企…

MVC Layout布局系统

原文&#xff1a;http://www.cnblogs.com/highend/archive/2011/04/18/asp_net_mvc3_layout.html Layout页:该家伙其实就相当于原来的Master文件. Partial页:相当于原来的UserControl View页: View Page with Layout:等同于原来的View Content Page.它的功能只是为了实现原来在…