ios-prepareForSegue情境切換KVC傳值詳解
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觸發的切換情境