写给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)的更多相关文章

  1. 【转】iOS 开发之协议protocal-代理传值delegate

    原文网址:http://www.cnblogs.com/wzrong/p/3201938.html 刚开始做iOS开发的时候,对 protocol.delegate 的理解一直都是晕晕乎乎一知半解的状 ...

  2. ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别

    一.Delegate Delegate本质是一种程序设计模型,iOS中使用Delegate主要用于两个页面之间的数据传递.iphone中常用@protocol和delegate的机制来实现接口的功能. ...

  3. iOS 再谈 代理传值,block反向传值

    本贴的例子是:有A和B两个界面,要实现的效果就是先让A跳转到B,然后B中有个颜色的参数,当B跳转到A时,把这个颜色的参数传递给A,在A中利用这个颜色改变自己界面的颜色. 第1步:在发送者(界面B)中, ...

  4. IOS笔记047-代理传值和block传值

    在两个不同的控制器之间传递数据,可以使用代理传值或者block传值. 例子是一个简单通讯录. 主界面如下: 添加联系人界面 查看/编辑联系人界面:默认是查看模式,点击编辑后进入编辑模式 编辑模式 数据 ...

  5. iOS基础问答面试

    <简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw> ...

  6. [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  7. iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)

    iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)   使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: ...

  8. 【iOS 使用github上传代码】详解

    [iOS 使用github上传代码]详解 一.github创建新工程 二.直接添加文件 三.通过https 和 SSH 操作两种方式上传工程 3.1https 和 SSH 的区别: 3.1.1.前者可 ...

  9. iOS上架ipa上传问题那些事

    iOS上架ipa上传问题那些事 原文: http://www.jianshu.com/p/1e22543285c2 字数513 阅读312 评论0 喜欢1 通过xcode直接打包上传,不会提示你的ip ...

随机推荐

  1. 为什么delphi控件前面都有t

    控件的类名都有一个T字, 它是Type的第一个字母. 比如按钮就是TButton. 但在Delphi的控件面板上的并不带T字, 比如就是Button. 如果你把它放在窗体上, 默认名字则成为Butto ...

  2. 状态开关按钮(ToggleButton)与开关(Switch)的功能与用法

    状态开关按钮(ToggleButton)与开关(Switch)也是由Button派生出来的,因此它们的本质也是按钮,Button支持的各种属性.方法也适用于ToggleButton和Switch.从功 ...

  3. Eclipse设置Tab键为空格!

    http://z-hua.iteye.com/blog/1056713 今天设置Eclipse中按Tab键为4个空格,这里标记下! Window-->Preferences-->Java- ...

  4. 给Pomelo的聊天室添加time的RPC调用

    为了练手,给聊天应用增加一个rpc调用和一个time类型的服务器,在servers/time/remote/timeRemote.js中,添加如下代码: module.exports.getCurre ...

  5. Boost.Asio技术文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  6. aJax请求结果中包含form的问题

    jsp页面a.jsp如下: <form action='login' id='formId' method='post'> <input name='user'> </f ...

  7. mac命令行对复杂ipa包重新签名

    最近在做ios的自动化平台,需要通过命令行安装卸载ipa包 好了问题来,别人上传的ipa包,很可能是开发签名了只能在特定手机上安装的测试ipa包,那我们如何将其安装在我们的自动化的iphone上呢? ...

  8. linux上静态库链接的有关问题

    求大神,linux下静态库链接的问题有两个文件和一个库,a.c, b.c,libh.a,其中b.c里面会有调用libh.a的函数func1,现在将a.c, b.c,libh.a编译链接生成可执行文件, ...

  9. SSM框架注解整合

    一.web应用环境 1.ServletContext 对于一个web应用,其部署在web容器(比如:tomcat)中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext, ...

  10. ArcGIS制图技巧系列(1)还原真实的植被

    ArcGIS制图技巧系列(1)还原真实的植被 by 李远祥 在GIS数据中,植被一般都是面装要素的形式存在.很多人在使用植被渲染的时候,一般会采用填充符号去渲染.而在ArcGIS中,填充符号要么就是纯 ...