prepareForSegue场景切换KVC传值详解

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触发的切换场景

原文地址:

,如果你曾歌颂黎明,那么也请你拥抱黑夜

prepareForSegue场景切换KVC传值详解

相关文章:

你感兴趣的文章:

标签云: