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/

本文版權歸做者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做!

相關文章
相關標籤/搜索