iOS开发-使用Storyboard进行界面跳转及传值

前言:苹果官方是推荐咱们将全部的UI都使用Storyboard去搭建,Storyboard也是一个很成熟的工具了。使用Storyboard去搭建全部界面,咱们能够很迅捷地搭建出复杂的界面,也就是说能为咱们节省大量的时间。咱们还能够很直观地看出各个界面之间的关系,修改起来也很方便。未来若是遇到须要做修改的地方,咱们只须要找到相对应的Storyboard就能够了,比起之前来讲,快捷了很多。ide

 

我会在本文的最后附上Demo,能够帮助大家有更直观的理解,有须要的人能够去下载运行一下。工具

 

另外,建议你们实验每一种方法时,先清空界面上的内容,以免出现错误。由于初学者很容易使得界面上有残留,具体的这里就不说明了。接下来,让开始咱们的Storyboard之旅吧!atom

 

目录:spa

1、使用Storyboard进行跳转调试

1)纯Storybard界面操做code

2)使用代码进行跳转orm

2、Storyboard界面传值blog

1)使用prepareForSegue方法进行跳转:继承

2)Storyboard Id跳转事件

 

1、使用Storyboard进行跳转

1)纯Storyboard界面操做

咱们在Storyboard上放置一个按扭,在按扭上方点击并按住“右键”不放,拖动到跳转的下一个界面上。

 

松开右键后,会有一个黑色透明的弹出框,选择跳转的方式:

 

从这里能够看到,界面和界面之间多了一条线链接,以下图:

咱们能够在Xcode右边的工具栏看到,咱们刚刚的连线操做(如今能够运行项目了):

2)使用代码进行跳转

咱们把刚刚的连线删除掉,以下图所示:

新建一个继承于UIViewController的类CodeViewController:

选中按扭所在的界面,设置它的类文件,默认都是继承于UIViewController,以下图所示:

咱们把它改为刚刚新建的类“CodeViewController”,以下图所示:

把界面缩小(你能够在空白的地方双击一下,或者右键选择缩放比例),此次咱们不是直接使用“按扭”链接界面,而是进行界面和界面之间的连线,以下图所示:

注意:100%的缩放是不能进行界面和界面之间的连线!

以后的操做和前面的一致,为了容易理解,我仍是贴一下图:

选中“这条线”,在Storyboard Segue的Identifier指定一个标识符,后面咱们会用到: 

这时咱们须要为按扭添加一个事件,为此须要同时显示Storyboard和.m文件,操做以下:

建立事件的操做和以前连线的操做同样:

为这个事件建立一个名字,而后点击Connect:

在事件里添加以下代码,把刚连线的Identifier传进去,sender通常为"self":

[self performSegueWithIdentifier:@"EasyCode" sender:self];

这样,就能够成功跳转了。

 

2、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];
}

能够运行程序了,可以成功接收到值,成功!

 

小结:大家可否看出各个方法的优势和缺点?如今没发现没关系,当大家之后赶上真正须要的时候,优缺点就很容易知道了,这也算是留给大家思考的一件事情吧。

 

题外话:

有部分人是不一样意使用Storyboard的,他们的的观点以下:

1)Storyboard出现的错误不能调试,每每使得他们开发缓慢

2)对于多人开发,版本管理会比较复杂

3)Storyboard常常平白无故出现问题!使得他们很头痛!

首先,对于第1点和第3点的回答:Storyboard出现的错误每每是能够避免的。其次,Storyboard不会平白无故出现问题,若是真的出现问题了,每每是开发者的操做不当成形成的。我为何这样说?

由于我之前也遇到不少因Storyboard引发的错误,那时候的我也常常怨Storyboard。但随着对Storyboard愈来愈熟悉后,我才发现,之前全都是由于本身操做不当,而形成程序的崩溃。

第2点:多人开发,能够区分模块开发,每一个人负责的模块都不相同,不必定要全部人的都开发同一个模块。固然,有特殊状况的我也不知道,因此说这个须要根据项目的大小和复杂度去断定的。

 

花了一个下午去写这一篇文章,感受好累好累。

但愿这篇文章能对你们所帮助,谢谢。

 

Demo下载地址:

http://pan.baidu.com/s/1bnCkydD

 


博文做者:GarveyCalvin

博文出处:http://www.cnblogs.com/GarveyCalvin/

本文版权归做者和博客园共有,欢迎转载,但须保留此段声明,并给出原文连接,谢谢合做!

相关文章
相关标签/搜索