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 ...
随机推荐
- thinkphp CURD 1
二.ThinkPHP 3 读取数据 (重点) 对数据的读取 Read $m=new Model('User'); $m=M('User'); select $m-> ...
- firefox-Developer开发者站点——关于Object.create()新方法的介绍
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create Objec ...
- 高斯RBF核函数中Sigma取值和SVM分离面的影响
1:高斯RBF核函数的定义 k(x) = exp(-x^2/(2×sigma)) 在MATLAB中输入一下代码:ezsurf('exp(-x^2/(2*sigma^2))'); 在GOOGLE中输入“ ...
- HDU-2573-Typing
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2573 这题把%s与gets()的输入法搞混了一直感觉没有错,就是找不出哪里错了, 题目思路不是很难. ...
- C++实现具有基本功能的智能指针
C++中的智能指针实际上是代理模式与RAII的结合. 自定义unique_ptr,主要是release()和reset().代码如下. #include <iostream> using ...
- Spring 基于Java的Bean声明
Spring 基于Java的Bean声明 使用@Configuration进行设置: Xml: <?xml version="1.0" encoding="UTF- ...
- 《转》VS2010进行远程调试方法总结
---恢复内容开始--- 原文地址:http://blog.sina.com.cn/s/blog_a459dcf5010153o7.html 假设现在有A.B两台PC机. VS2010安装在A机器上, ...
- 微信小程序之快速接入七牛云
小程序为什么要接入云? 目前,开发者在开发小程序过程中,主要遇到以下几个问题: 小程序发布大小超限 微信官方限制小程序的发布代码不能超过 1MB,而在实际开发过程中,一般的小程序难免会有图片等富媒体文 ...
- 为 Jenkins 配置 .Net 持续集成环境
去年年底,得益于公司引入 Jenkins,让我们在持续集成方面迈出了第一步,本文不赘述如何安装 Jenkins,主要关注点在于配置 .Net 环境.另外本文是在 Windows 环境下安装的 Jenk ...
- DDD创始人Eric Vans:要实现DDD原始意图,必须CQRS+Event Sourcing架构
http://www.infoq.com/interviews/Technology-Influences-DDD# 要实现DDD(domain drive design 领域驱动设计)原始意图,必 ...