你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> ios-prepareForSegue場景切換KVC傳值詳解

ios-prepareForSegue場景切換KVC傳值詳解

編輯:IOS開發綜合

iOS開發中,通過 storyboard 可以直接切換場景,也就是在 不同的ViewController之間跳轉;在跳轉的過程中會自動的調用prepareForSegue方法,我們在該方法中可以 直接給 目標場景設置要傳入的值;下面來介紹一下,使用KVC和普通的屬性方式來傳值的小Demo.

如下圖,有兩個 視圖控制器,A和 B ,

A的視圖控制器上有一個按鈕,拖拽按鈕的事件到 B 控制器上 (使用show),

A在切換的過程中需要給B一個number值,B收到該值之後顯示出來;

A綁定的類是,ViewController,B綁定的是BViewController

\

使用storyboard的傳值,默認會觸發

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

在這個方法中,segue參數包含重要的3個屬性:

分別是: 控制器標識符,

源控制器,在上圖中就是A控制器

目標控制器,在上圖中就是B控制器

對應的屬性如下:

 

@property (nonatomic, readonly) NSString *identifier;
@property (nonatomic, readonly) id sourceViewController;
@property (nonatomic, readonly) id destinationViewController;

 

sender是觸發 這個場景切換的事件源,也就是 button

代碼如下:

A控制器對應的代碼:

 

//
//  ViewController.h
//  TestPrepareSegue
//
//  Created by yb on 15/2/10.
//  Copyright (c) 2015年 http://blog.csdn.net/yangbingbinga. All rights reserved.
//

#import 

@interface ViewController : UIViewController

@end

//
//  ViewController.m
//  TestPrepareSegue
//
//  Created by yb on 15/2/10.
//  Copyright (c) 2015年 http://blog.csdn.net/yangbingbinga. All rights reserved.
//

#import ViewController.h
#import BViewController.h

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}


#pragma makr - 場景切換,適合通過storyboard拖拽的切換
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    
    NSLog(@觸發該場景切換的sender對象的類型是:%@,[sender class]);
    
#pragma mark - 方法一,使用KVC給B 也就是目標場景傳值
    UIViewController *destinationController=[segue destinationViewController];
    
    [destinationController setValue:@119 forKey:@number];
    
#pragma mark - 方法2,使用屬性傳值,需導入相關的類.h
    
//    BViewController *bController=[segue destinationViewController];
//   bController.number=@188;
    
#pragma mark - 方法3,強制類型轉換
    
}
@end
B控制器對應的代碼:

 

 

//
//  BViewController.h
//  TestPrepareSegue
//
//  Created by 楊斌 on 15/2/10.
//  Copyright (c) 2015年 http://blog.csdn.net/yangbingbinga. All rights reserved.
//

#import 

@interface BViewController : UIViewController
@property(strong,nonatomic)NSValue *number;//接收來自A  controller傳來的值
@end

//
//  BViewController.m
//  TestPrepareSegue
//
//  Created by 楊斌 on 15/2/10.
//  Copyright (c) 2015年 http://blog.csdn.net/yangbingbinga. All rights reserved.
//

#import BViewController.h

@interface BViewController ()

@property (weak, nonatomic) IBOutlet UIButton *buttonOnB;
@end

@implementation BViewController

- (void)viewDidLoad {
    [super viewDidLoad];
#pragma mark - 打印接收到來自A 的值number
    NSLog(@%@,_number);
    
    [_buttonOnB setTitle:[NSString stringWithFormat:@收到來自A的傳值: %@,_number] forState:UIControlStateNormal];
    
    
}
@end

運行一下,點擊按鈕,可以跳轉到B並且 A給 B成功傳入 一個 NSValue類型的 值 number,

 

傳值時,使用KVC 或者 屬性傳值

最終效果如下:

\

 

可以看到B控制器,成功拿到 A傳來的值

注意事項:

1.不要 直接在 button也就是 事件源 直接拖拽切換事件到B的NavigationController上,否則會導致崩潰

2.根據上述, 一組 ViewControllers公用一個 NavigationController最好,可以 添加title後刪除Navigation

3.有時候可能需要比較sender的類型 來確定跳轉的來源;我們可以比較sender ,使用isEqualTo比較,確定是哪個sender觸發的切換場景

 

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved