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 <UIKit/UIKit.h> @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 <UIKit/UIKit.h> @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触发的切换场景
原文地址:http://blog.csdn.net/yangbingbinga
ios-prepareForSegue场景切换KVC传值详解
原文地址:http://blog.csdn.net/yangbingbinga/article/details/43704269