iOS开发中,通过 storyboard 可以直接切换场景,也就是在 不同的ViewController之间跳转;在跳转的过程中会自动的调用prepareForSegue方法,我们在该方法中可以 直接给 目标场景设置要传入的值;下面来介绍一下,使用KVC和普通的属性方式来传值的小Demo.
如下图,有两个 视图控制器,A和 B ,
A的视图控制器上有一个按钮,拖拽按钮的事件到 B 控制器上 (使用show),
A在切换的过程中需要给B一个number值,B收到该值之后显示出来;
A绑定的类是,ViewController,B绑定的是BViewController
使用storyboard的传值,默认会触发
在这个方法中,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年 All rights reserved.//#import <UIKit/UIKit.h>@interface ViewController : UIViewController@end//// ViewController.m// TestPrepareSegue//// Created by yb on 15/2/10.// Copyright (c) 2015年 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年 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年 All rights reserved.//#import "BViewController.h"@interface BViewController ()@property (weak, nonatomic) IBOutlet UIButton *buttonOnB;@end@implementation BViewController- (void)viewDidLoad {[super viewDidLoad];#pragma mark – 打印接收到来自A 的值numberNSLog(@"%@",_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触发的切换场景
原文地址:
,如果你曾歌颂黎明,那么也请你拥抱黑夜