iOS基础之顺传逆传传值(delegate、block)
写给iOS新手的福利!
在项目中经常会用到传值,根据传值的方向分为顺传(从根控制器到子控制器)和逆传(从子控制器到根控制器)。在这里写了个Demo简单演示了效果,创建了两个控制器:

一个为根控制器,一个为子控制器。
顺传:这种传值方式最为简单,在子控制器中添加一个属性即可。
下面是OtherViewController.h文件
#import <UIKit/UIKit.h> @interface OtherViewController : UIViewController /** 顺传数据 */
@property(nonatomic, copy) NSString *pushString; @end
在根控制器中,跳转时设置传入值
OtherViewController *otherVC = [[OtherViewController alloc] init];
otherVC.pushString = @"从根控制器传入的字符串";
[self.navigationController pushViewController:otherVC animated:YES];
这样就可以在子控制器中获取传入值。
逆传(delegate方式):
下面是OtherViewController.h文件,添加协议方法和代理。
#import <UIKit/UIKit.h> @protocol OtherViewControllerDelegate <NSObject> - (void)popVCWithString:(NSString *)popString; @end @interface OtherViewController : UIViewController /** 代理 */
@property(nonatomic, weak) id<OtherViewControllerDelegate> delegate; @end
在需要传值的时候,使用以下代码传出需要传的值:
if ([self.delegate respondsToSelector:@selector(popVCWithString:)]) {
[self.delegate popVCWithString:@"通过代理从子控制器传回的字符串"];
}
这个时候需要在根控制器(ViewController.m)中进行设置了,设置代理:
OtherViewController *otherVC = [[OtherViewController alloc] init];
// 设置代理
otherVC.delegate = self;
[self.navigationController pushViewController:otherVC animated:YES];
遵守代理协议:
// 遵守代理协议
@interface ViewController ()<OtherViewControllerDelegate>
实现代理方法:
// 代理方法
- (void)popVCWithString:(NSString *)popString
{
// 在这里获取逆传的值
NSLog(@"popString ----- %@", popString);
}
逆传(block方式):
在子控制器(OtherViewController.h)中声明Block,添加Block属性
#import <UIKit/UIKit.h> typedef void(^PopStringBlock)(NSString *popString); @interface OtherViewController : UIViewController /** Block */
@property(nonatomic, copy) PopStringBlock popBlock; @end
在需要传值的时候,使用以下代码传出需要传的值:
self.popBlock(@"通过Block从子控制器传回的字符串");
这个时候只需要在根控制器(ViewController.m)中需要取值的地方调用Block即可:
OtherViewController *otherVC = [[OtherViewController alloc] init];
otherVC.popBlock = ^(NSString *popString) {
// 获取Block方式逆传的值
NSLog(@"popString ----- %@", popString);
};
[self.navigationController pushViewController:otherVC animated:YES];
写的比较简单,关键地方都附上代码了,不明白的可以去看我的Demo: https://github.com/sjxjjx/Delegate_Block 。
iOS基础之顺传逆传传值(delegate、block)的更多相关文章
- 【转】iOS 开发之协议protocal-代理传值delegate
原文网址:http://www.cnblogs.com/wzrong/p/3201938.html 刚开始做iOS开发的时候,对 protocol.delegate 的理解一直都是晕晕乎乎一知半解的状 ...
- ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别
一.Delegate Delegate本质是一种程序设计模型,iOS中使用Delegate主要用于两个页面之间的数据传递.iphone中常用@protocol和delegate的机制来实现接口的功能. ...
- iOS 再谈 代理传值,block反向传值
本贴的例子是:有A和B两个界面,要实现的效果就是先让A跳转到B,然后B中有个颜色的参数,当B跳转到A时,把这个颜色的参数传递给A,在A中利用这个颜色改变自己界面的颜色. 第1步:在发送者(界面B)中, ...
- IOS笔记047-代理传值和block传值
在两个不同的控制器之间传递数据,可以使用代理传值或者block传值. 例子是一个简单通讯录. 主界面如下: 添加联系人界面 查看/编辑联系人界面:默认是查看模式,点击编辑后进入编辑模式 编辑模式 数据 ...
- iOS基础问答面试
<简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw> ...
- [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)
A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不 ...
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值) 使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: ...
- 【iOS 使用github上传代码】详解
[iOS 使用github上传代码]详解 一.github创建新工程 二.直接添加文件 三.通过https 和 SSH 操作两种方式上传工程 3.1https 和 SSH 的区别: 3.1.1.前者可 ...
- iOS上架ipa上传问题那些事
iOS上架ipa上传问题那些事 原文: http://www.jianshu.com/p/1e22543285c2 字数513 阅读312 评论0 喜欢1 通过xcode直接打包上传,不会提示你的ip ...
随机推荐
- ubuntu系统中crontab的使用介绍
1.创建crontab任务 用户hancool
- Java经典案例之“水仙花数”
/** * 描述:打印出所有的“水仙花数”,所谓的“水仙花数”是指一个三位数,其各位数字立方和等于该数本身.例如: * 153=1^3+5^3+3^3等... * 分析:利用for循环控制100-99 ...
- Alamofire 4.0 迁移指南
Alamofire 4.0 是 Alamofire 最新的一个大版本更新, 一个基于 Swift 的 iOS, tvOS, macOS, watchOS 的 HTTP 网络库. 作为一个大版本更新, ...
- Eclipse 使用说明
2. 使用技巧 2.1. Eclipse 打开文件所在文件夹 2.2. Mac 安装Eclipse 2.3. Eclipse 安装插件 2.4. Eclipse 工具栏不见了 2.5. Eclipse ...
- windows下安装php5.2.*,php5.3.*,php5.4.*版本的memcache扩展
注:如使用集成环境成功率低,请自行配置php apache,表示win7下wamp php5.4.3基础上配置拓展,成功率极低.费时. 拓展安装调试方法: 编写调试php文件 <?php me ...
- 如何开发基于Dubbo RPC的分布式服务?
什么是Dubbo? Dubbo能做什么? 在Crystal框架下,如何开发基于Dubbo RPC的服务? 在Crystal框架下,如何调用Dubbo RPC服务? 相关的文章 什么是Dubbo? Du ...
- yum网络源配置
[root@xuegod60 ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak[root@x ...
- jquery 精度计算代码,指定精确小数位
jquery代码: /** * 将标签的值格式化 * id 标签id * min 最小值 * max 最大值 */ function toFloat(id,min,max){ var htmlVal ...
- ESLint 规则详解(一)
前端界大神 Nicholas C. Zakas 在 2013 年开发的 ESLint,极大地方便了大家对 Javascript 代码进行代码规范检查.这个工具包含了 200 多条 Javascript ...
- mybatis入门-新手注意问题
参数问题 在映射文件中通过parameterType指定输入参数的类型:在映射文件中通过resultType指定输出结果的类型. 占位符和拼接符问题 #{}表示一个占位符号,#{}接收输入参数,类型可 ...