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 <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,强制类型转换
    
}
@end
B控制器对应的代码:

//
//  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

运行一下,点击按钮,可以跳转到B并且 A给 B成功传入 一个 NSValue类型的 值 number,

传值时,使用KVC 或者 属性传值

最终效果如下:

技术分享


可以看到B控制器,成功拿到 A传来的值

注意事项:

1.不要 直接在  button也就是 事件源 直接拖拽切换事件到B的NavigationController上,否则会导致崩溃

2.根据上述, 一组 ViewControllers公用一个 NavigationController最好,可以 添加title后删除Navigation

3.有时候可能需要比较sender的类型 来确定跳转的来源;我们可以比较sender ,使用isEqualTo比较,确定是哪个sender触发的切换场景

原文地址:http://blog.csdn.net/yangbingbinga


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。