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,強制類型轉換 } @endB控制器對應的代碼:
// // 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
傳值時,使用KVC 或者 屬性傳值
最終效果如下:
可以看到B控制器,成功拿到 A傳來的值
注意事項:
1.不要 直接在 button也就是 事件源 直接拖拽切換事件到B的NavigationController上,否則會導致崩潰
2.根據上述, 一組 ViewControllers公用一個 NavigationController最好,可以 添加title後刪除Navigation
3.有時候可能需要比較sender的類型 來確定跳轉的來源;我們可以比較sender ,使用isEqualTo比較,確定是哪個sender觸發的切換場景