IOS开发-使用Storyboard进行界面跳转及传值
前言:苹果官方是推荐我们将全部的UI都使用Storyboard去搭建,Storyboard也是一个非常成熟的工具了。
使用Storyboard去搭建全部界面,我们能够非常迅捷地搭建出复杂的界面,也就是说能为我们节省大量的时间。我们还能够非常直观地看出各个界面之间的关系,改动起来也非常方便。将来假设遇到须要作改动的地方。我们仅仅须要找到相相应的Storyboard就能够了。比起曾经来说。快捷了不少。
我会在本文的最后附上Demo,能够帮助你们有更直观的理解,有须要的人能够去下载执行一下。
另外。建议大家实验每一种方法时,先清空界面上的内容,以避免出现错误。由于刚開始学习的人非常easy使得界面上有残留,详细的这里就不说明了。接下来,让開始我们的Storyboard之旅吧。
文件夹:
一、使用Storyboard进行跳转
1)纯Storybard界面操作
2)使用代码进行跳转
二、Storyboard界面传值
1)使用prepareForSegue方法进行跳转:
2)Storyboard Id跳转
一、使用Storyboard进行跳转
1)纯Storyboard界面操作
我们在Storyboard上放置一个按扭。在按扭上方点击并按住“右键”不放,拖动到跳转的下一个界面上。
松开右键后,会有一个黑色透明的弹出框,选择跳转的方式:
从这里能够看到,界面和界面之间多了一条线连接。例如以下图:
我们能够在Xcode右边的工具栏看到,我们刚刚的连线操作(如今能够执行项目了):
2)使用代码进行跳转
我们把刚刚的连线删除掉,例如以下图所看到的:
新建一个继承于UIViewController的类CodeViewController:
选中按扭所在的界面,设置它的类文件,默认都是继承于UIViewController,例如以下图所看到的:
我们把它改成刚刚新建的类“CodeViewController”,例如以下图所看到的:
把界面缩小(你能够在空白的地方双击一下,或者右键选择缩放比例),这次我们不是直接使用“按扭”连接界面,而是进行界面和界面之间的连线。例如以下图所看到的:
注意:100%的缩放是不能进行界面和界面之间的连线!
之后的操作和前面的一致,为了easy理解,我还是贴一下图:
选中“这条线”。在Storyboard Segue的Identifier指定一个标识符,后面我们会用到:
这时我们须要为按扭加入一个事件,为此须要同一时候显示Storyboard和.m文件,操作例如以下:
创建事件的操作和之前连线的操作一样:
为这个事件创建一个名字。然后点击Connect:
在事件里加入例如以下代码。把刚连线的Identifier传进去,sender一般为"self":
[self performSegueWithIdentifier:@"EasyCode" sender:self];
这样,就能够成功跳转了。
二、Storyboard界面传值
1)使用prepareForSegue方法进行跳转:
我们创建两个类,PrepareViewController和ReceiveViewController
然后在Storyboard上新建两个ViewController,把两个界面连接起来。
操作步骤和上方(代码跳转)的同样,这次我们把连线的Identifier定义为“SendValue”:
有按扭的界面的类设置为PrepareViewController。例如以下图所看到的:
选择第二个界面,设置继承的类为ReceiveViewController:
ReceiveViewController.h:
#import <UIKit/UIKit.h> @interface ReceiveViewController : UIViewController @property (strong, nonatomic) NSString *name; @property (assign, nonatomic) int age; @end
ReceiveViewController.m,当然是要输出一下啦,不然怎么知道传值有没有成功:
#import "ReceiveViewController.h" @interface ReceiveViewController () @end @implementation ReceiveViewController - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"name is %@, age is %d", _name, _age); } @end
PrepareViewController.m文件:
#import "PrepareViewController.h" #import "ReceiveViewController.h" @interface PrepareViewController () @end @implementation PrepareViewController - (IBAction)goAction:(id)sender { // 依据指定线的ID跳转到目标Vc [self performSegueWithIdentifier:@"SendValue" sender:self]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // segue.identifier:获取连线的ID if ([segue.identifier isEqualToString:@"SendValue"]) { // segue.destinationViewController:获取连线时所指的界面(VC) ReceiveViewController *receive = segue.destinationViewController; receive.name = @"Garvey"; receive.age = 110; // 这里不须要指定跳转了。由于在按扭的事件里已经有跳转的代码 // [self.navigationController pushViewController:receive animated:YES]; } } @end
能够成功接收到值啦(大功告成):
2)Storyboard Id跳转
继续拖两个纯净的界面(VC)到Storyboard上,第一个界面也是放上一个UIButton:
IdViewController是我刚新建出来的类,接收值的界面用回ReceiveViewController类,指定界面继承的类为(IdViewController、ReceiveViewController)
第二个界面设置Storyboard id为“IdReceive”。后面跳转会用到:
IdViewController.m
- (IBAction)action:(id)sender { // 获取指定的Storyboard,name填写Storyboard的文件名称 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; // 从Storyboard上依照identifier获取指定的界面(VC)。identifier必须是唯一的 ReceiveViewController *receive = [storyboard instantiateViewControllerWithIdentifier:@"IdReceive"]; receive.name = @"GC"; receive.age = 10; [self.navigationController pushViewController:receive animated:YES]; }
能够执行程序了。能够成功接收到值,成功。
小结:你们是否能看出各个方法的长处和缺点?如今没发现不要紧。当你们以后遇上真正须要的时候,优缺点就非常easy知道了。这也算是留给你们思考的一件事情吧。
题外话:
有部分人是不允许使用Storyboard的,他们的的观点例如以下:
1)Storyboard出现的错误不能调试,往往使得他们开发缓慢
2)对于多人开发,版本号管理会比較复杂
3)Storyboard常常无缘无故出现故障!
使得他们非常头痛。
首先,对于第1点和第3点的回答:Storyboard出现的错误往往是能够避免的。其次。Storyboard不会无缘无故出现故障。假设真的出现故障了。往往是开发人员的操作不当成造成的。
我为什么这样说?
由于我曾经也遇到非常多因Storyboard引起的错误,那时候的我也常常怨Storyboard。但随着对Storyboard越来越熟悉后。我才发现,曾经全都是由于自己操作不当,而造成程序的崩溃。
第2点:多人开发。能够区分模块开发,每一个人负责的模块都不同样,不一定要全部人的都开发同一个模块。
当然。有特殊情况的我也不知道,所以说这个须要依据项目的大小和复杂度去判定的。
花了一个下午去写这一篇文章。感觉好累好累。
希望这篇文章能对大家所帮助。谢谢。
Demo下载地址:
http://pan.baidu.com/s/1bnCkydD
博文作者:GarveyCalvin