iOS中传值方式有好几种,分别是:代理传值,block传值,属性传值,通知传值,单例传值,利用userdefault或者文件方式传值,通常代理传值和block传值使用最普遍,本文介绍代理传值的方式,后续博客会一次写上其他传值方式。

一 什么是委托代理?

1、协议(protocol),就是使用了这个协议后,必须按照协议规定的内容来处理事情,协议中要求的方法必须实现(@optional的方法除外)。

protocol是一种语法,它提供了一个很方便的、实现delegate模式的机会。

定义protocol如下:

  1. @protocol ClassBDelegate<NSObject>
  2. - (void)methodOne;
  3. @optional
  4. - (void)methodTwo:(NSString *)value;
  5. @end

定义了一个ClassB的协议,这个协议中包含两个方法,其中methodTwo为可选的。

在ClassA的头文件(ClassA.h)中实现这个协议,如下代码:

  1. @interface ClassA<ClassBDelegate>
  2. @end

在ClassA的实现文件(ClassA.m)中实现ClassBDelegate的两个方法,其中methodTwo可以不实现,如下:

  1. - (void)methodOne{
  2. // 具体实现内容
  3. }
  4. - (void)methodTwo:(NSString *)value{
  5. // 具体实现内容
  6. }

2、代理(delegate),顾名思义就是委托别人办事,当一件事情发生后,自己不处理,让别人来处理。

delegate和protocol没有关系。delegate本身是一种设计模式。是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成。

在ClassB的头文件(ClassB.h)中定义一个代理如下:

  1. @interface ClassB
  2. @property (nonatomic, unsafe_unretained) id<ClassBDelegate> delegate;
  3. @end

这样,当我们在ClassB的实现文件(ClassB.m)中遇到想让别的类(如 ClassA)处理的问题时,就可以这样

  1. [self.delegate methodOne];
  2. [self.delegate methodTwo:@"需要传递的值"];

二  具体实例

   实现的功能是:在viewcontroller中创建一个UIButton按钮用于push到下一个页面,和一个UILable用于显示从第二个页面传回的文字,在secondviewcontroller中创建一个UITextfield用于输入文字。在输入完成按下back返回第一个页面后,在lable上显示输入的文字。

1 工程截图

2  ViewController.h文件

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

3  ViewController.m文件

#import "ViewController.h"

#import "SecondViewController.h"

@interface ViewController ()<getTextFromDelegate>

{

UIButton *_button;

UILabel *_lable;

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

[self initLayout];

}

- (void)initLayout{

_button = [UIButton buttonWithType:UIButtonTypeSystem];

_button.frame = CGRectMake(0, 0, 100, 50);

_button.center = self.view.center;

_button.backgroundColor = [UIColor redColor];

[_button addTarget:self action:@selector(pushToNextViewController:) forControlEvents:UIControlEventTouchUpInside];

[_button setTitle:@"下一页" forState:UIControlStateNormal];

[self.view addSubview:_button];

_lable = [[UILabel alloc]initWithFrame:CGRectMake(10, 64, 355, 200)];

_lable.backgroundColor = [UIColor orangeColor];

[self.view addSubview:_lable];

}

- (void)pushToNextViewController:(UIButton *)sender{

SecondViewController *secondVC = [SecondViewController new];

//代理就是本身

secondVC.delegate = self;

[self.navigationController pushViewController:secondVC animated:YES];

}

#pragma mark 实现代理方法

- (void)getText:(NSString *)text{

_lable.text = text;

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

4  SecondViewController.h文件

#import <UIKit/UIKit.h>

@protocol getTextFromDelegate <NSObject>

//声明协议方法

- (void)getText:(NSString *)text;

@end

@interface SecondViewController : UIViewController

@property (weak, nonatomic)id<getTextFromDelegate>delegate;

@end

4  SecondViewController.m文件

#import "SecondViewController.h"

@interface SecondViewController ()<getTextFromDelegate>

{

UITextField *_textField;

}

@end

@implementation SecondViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor whiteColor];

_textField = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 200, 50)];

_textField.backgroundColor = [UIColor redColor];

_textField.center = self.view.center;

[self.view addSubview:_textField];

}

#pragma mark 在页面将要消失时

- (void)viewWillDisappear:(BOOL)animated{

//将本页面获取的值传递给上一个页面去实现

[self.delegate getText:_textField.text];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

三  模拟器运行结果截图

转载于:https://www.cnblogs.com/blogoflzh/p/4676241.html

iOS传值之代理传值相关推荐

  1. iOS pop使用代理传值

    假如oneViewController页面push到OtherViewController页面,然后你想从OtherViewController页面pop到oneViewController页面的时候 ...

  2. iOS笔记UI--委托代理传值

    /* 代理传值思路 1.设置协议方法 2.设置一个ViewController为代理,遵循协议,实现协议方法 3.在点击方法里面,另一个ViewController的委托为这个ViewCOntroll ...

  3. 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值...

    实验说明 (1)正向传值:比如A类里地值要传给B类用,就是我们先在A类中声明一个B类对象(当然B类头文件要import过来),然后把A类中得某个 值传递给B类中得某个值(所以需要在B类中先准备一个变量 ...

  4. Swift之UITextField+富文本+代理传值

    ###导语: UITextField有许多好玩好用的地方,因此敝人整理了一些知识点和技巧分享给大家. ####一.初始化 var textField: UITextField!override fun ...

  5. 四大传值详解:属性传值,单例传值,代理传值,block传值

    一:属性传值 传值情景:从前一个页面向后一个页面传值 a.在后一个页面,根据传值类型和个数,写属性 b.在前一个页面, 为属性赋值 c.在后一个页面, 使用值 例如: 第一个视图: #import & ...

  6. swift 用协议实现代理传值功能

    2019独角兽企业重金招聘Python工程师标准>>> swift 用协议实现代理传值功能 原文  http://blog.csdn.net/whzhaochao/article/d ...

  7. OS笔记047代理传值和block传值

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

  8. h5-(安卓和ios)之间的传值

    背景: 在我们工作中或多或少会遇到这样的需求:那就是h5与安卓和ios的传参问题:今天我给大家介绍一下大致的用法,希望能帮到你! 1.创建一个文件:JSBridge.js 复制以下代码即可: cons ...

  9. ios学习-delegate、传值、跳转页面

    ios学习-delegate.传值.跳转页面   1.打开xcode,然后选择ios--Application--Empty Application一个空项目. 项目目录: 2.输入项目名称以及选择保 ...

最新文章

  1. 2018 ICPC 青岛 L. Sub-cycle Graph(生成函数)
  2. 顺序队列相关操作(C语言实现)
  3. GetOverlappedResult函数详细解答
  4. maven中jar下载失败
  5. 多路 IO 转接 :epoll 函数
  6. PL/SQL Developer连接Oracle 11g在Win8 64位系统下乱码
  7. mysql的comment_mysql的comment怎么用
  8. 原生社区交友婚恋视频即时通讯双端APP源码ONE兔2.0版
  9. 泰坦尼克号数据下载链接
  10. 计算机文化基础练习题及答案
  11. stap监控IO脚本
  12. 【大咖周刊】Linus 在谷歌介绍 Git、IBM340亿收购小红帽、IDE Visual Studio 开始支持 Java 了...
  13. IDEA导入已有项目
  14. 提问的力量(一):提问在学习中的价值
  15. prisma 风格设置_Prisma中的身份验证-第1部分:设置
  16. 如何准备机器学习工程师的面试 ?
  17. opencv 求矩阵的逆
  18. 【数模系列】02_三大相关系数+Python代码
  19. iOS开发小记:初次接入环信SDK3.0时遇到的问题及解决办法汇总
  20. 谈一谈对 TailwindCSS 的看法

热门文章

  1. 苹果笔记本电脑电池保养细则
  2. 迅速返回页面顶部代码
  3. what do we want for advertiesement
  4. 比git更加方便快捷的GitHub 仓库管理工具GitHub desktop
  5. 为什么我的理论和实践之间的差距相对较大
  6. PA银行面试之炮灰之程
  7. ios-NSMutableAttributedString 更改文本字符串颜色、大小
  8. Frameless - 用于预览 iOS8 原型的浏览器
  9. 【Review】Review of Sprint 1 Sprint 2 planning
  10. Windows XP添加网络打印机的方法