iOS-prepareForSegue场景切换,KVC传值

来源:互联网 发布:手机淘宝店装修教程 编辑:程序博客网 时间:2024/05/17 07:06

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


0 0