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];
//   [email protected];

#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

时间: 2024-10-31 09:18:16

ios-prepareForSegue场景切换KVC传值详解的相关文章

&quot;MindManager&quot;学习iOS系列之&quot;CAAnimation-核心动画&quot;详解,让你的应用“动”起来。

"MindManager"学习iOS系列之"CAAnimation-核心动画"详解,思维导图内展示了CAAnimation-核心动画的大多数基本功能和知识,每个part都有代码讲解,展示出CAAnimation-核心动画的清晰轮廓,编者提供了"JPG"."SWF"."PDF"."Word"."Mmap"格式的源文件供给使用.注意:JPG格式仅为图片总览,SWF格式使用

jquery.cycle.js图片切换插件参数详解

jquery.cycle.js是jquery的一个插件,主要用来实现千奇百怪的图片切换效果---当然,不是图片也能切换,只是它经常被用来做图片切换而已:这个插件总共有27种效果,是非常好的插件,用到手机版开发是很好的插件来的: 当然jquery.cycle.js的强大远不止于此,下面列举一些它的基本参数: fx:'fade'>值:字符串,作用:选择特效.切换效果是它的重头戏,我统计过,jquery.cycle.js支持27种切换效果,我一一进行了测试,列举在jquery.cycle.js切换特效

IOS开发学习笔记(1)-----UILabel 详解

1. [代码][C/C++]代码     //创建uilabelUILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)];//设置背景色label1.backgroundColor = [UIColor grayColor];//设置taglabel1.tag = 91;//设置标签文本label1.text = @"Hello world!";//设置标签文本字体和字体大小label1.

IOS开发学习笔记(2)-----UIButton 详解

1. [代码][C/C++]代码     //这里创建一个圆角矩形的按钮    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];    //    能够定义的button类型有以下6种,//    typedef enum {//        UIButtonTypeCustom = 0,          自定义风格//        UIButtonTypeRoundedRect,        

iOS企业证书网页分发全过程详解(图文并茂史无前例的详细哦)

iOS企业证书网页分发全过程详解 苹果的企业级证书发布的应用,是不用设备授权即可直接安装,并且不限设备上限.为了方便分发,苹果有协议实现通过网页链接直接下载安装企业级的应用. 首先需要说明它的原理:基本的原理就是在生成企业证书授权的ipa的同时,要生成一个对应的plist文件,plist文件中会配置ipa的下载地址.版本信息.Bundle ID 等信息,通过网页下载的时候其实下载的是这个plist文件,然后苹果通过自己的协议根据plist文件的配置信息去自动的下载安装app. 这里有个地址用来生

PySide2(PyQt5) 实现tab切换及方法详解(不定时更新)

更多分享:www.catbron.cn tab的实现用到的是QTabWidget控件,以下仅做简单的演示 源码: import sys from PySide2 import QtCore, QtGui, QtWidgets class MainWindow(): def __init__(self): self.window = QtWidgets.QMainWindow() self.initSize(0.6) self.mainWidget = QtWidgets.QWidget() se

iOS开发——多线程OC篇&amp;多线程详解

多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念: 进程 正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间 线程 线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代

KVC方法详解与实现原理

KVC提供了一种在运行时而非编译时动态访问对象属性与成员变量的方式,该方法不需要调用get和set方法和变量实例就可以访问对象,KVC默认的实现方法有NSOject提供,这种方法及支持对象也支持简单数据类型. 第一.在OC中访问变量的几种方式: 1.设置为public型,通过->直接访问: 代码为: @interface Book : NSObject { @public NSString *name; } Book *book=[[Bookalloc]init]; book->[email 

ios开发——实战OC篇&amp;FMDB详解

FMDB详解 前一篇文章中我们介绍的SQLite的使用,在iOS中原生的SQLite API在使用上相当不友好. 于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,工程中必须导入,并使用 libsqlite3.dylib 依赖包. F