iOS 中delegate的理解与使用(传值)

之前做了半年的iOS,刚入了门,又被拉去转战java,现在iOS的那位大佬离职了,又被弄过来维护app,之前对于iOS中的delegate一直都是半知半解,所以刚好趁着这个机会把我所了解的记下来,以便日后查阅。

- delegate的理解

delegate, 也就是代理模式(设计模式的一种),我现在所了解的代理模式是,当我有事要做但是没空的时候,我就可以请别人帮下忙,我告诉你我要做什么,但是具体怎么做,那是你的事了,就比如说,我想去约个妹纸出来玩,但是自己刚好现在有事不能约,或者自己不好意思约,这时候可以请朋友帮忙约一下,这时朋友就是你的代理(被委托者)了,你就是委托者,你告诉他你的目的是要约妹纸出来玩,约妹纸出来玩也就是你和他之间的协议,至于他怎么把妹纸约出来,你是不用关心的。

delegate最常用的地方就是逆向传值了(正向传值直接用属性传值就行了)

一般的委托者需要做的事:

      1、创建协议(也就是代理要实现的方法)

      2、声明委托变量

      3、设置代理(也可以在代理中设置)

      4、利用委托变量来调用协议方法(也就是让代理者开始执行协议)

代理需要做的事:

      1、遵循协议

      2、实现协议方法

这里有两个页面VCA、VCB,我先从VCA Push到VCB,在VCB的一个textfield中输入我想要传的值,等点击按钮POP回到VCA的时候,把VCB中textfield中的值展示到VCA的label中,这时候VCB就是委托者,VCA就是代理,代码如下:

1、创建协议

//在VCB中创建协议

//ViewControllerB.h

//创建协议
@protocol VcBDelegate <NSObject>
- (void)sendValue:(NSString *)value; //声明协议方法
@end

2、声明委托变量

//ViewControllerB.h

@interface ViewControllerB : UIViewController
@property (nonatomic, weak)id<VcBDelegate> delegate; //声明协议变量
@end

3、设置代理 (我是在VCA按钮跳转的时候设置的代理,所以是在VCA.m中设置的)

//ViewControllerA.m

- (void)btnClicked
{
    ViewControllerB *vcB = [ViewControllerB new];
    vcB.delegate = self;
    [self.navigationController pushViewController:vcB animated:YES];
}

4、利用委托变量来调用协议方法(也就是让代理者开始执行协议)

- (void)backActionClicked
{
    //当代理响应sendValue方法时,把_tx.text中的值传到VCA
    if ([_delegate respondsToSelector:@selector(sendValue:)]) {
        [_delegate sendValue:_tx.text];
        [self.navigationController popViewControllerAnimated:YES];
    }
}

5、在代理(ViewControllerA)中遵循协议

//viewControllerA.m

@interface ViewControllerA ()<VcBDelegate>//遵循协议
@property (nonatomic, strong) UILabel *recievedLB;
@end

6、代理实现协议方法

//ViewControllerA.m

//实现协议方法,把接收到的值展示到Label中

- (void)sendValue:(NSString *)value
{
    _recievedLB.text = value;
}

这样就OK了。

附上模拟器的效果图:

最后附上demo的git地址:https://github.com/fenglee594/delegateDemo

不喜勿喷,欢迎讨论。

时间: 2024-12-05 19:43:42

iOS 中delegate的理解与使用(传值)的相关文章

转iOS中delegate、protocol的关系

iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolcategoryobject-c 刚开始接触iOS,对delegate.protocol这两个概念比较模糊.参考了一些资料,记录下来体会. 1.protocol protocol和interface的概念类似,是object-c语法的一部分.protocol就是一系列不属于任何类的方法的列表.其中声明

【转载】iOS中delegate,notification,KVO三种模式实现通信的优缺点

原帖地址:http://blog.csdn.net/yangxt/article/details/8176636 在开发iOS中,有三种模式来实现controller之间的通信: 1.委托delegation: 2.通知中心Notification Center: 3.键值观察key value observing,KVO 因此,那为什么我们需要这些模式以及什么时候用它以及什么时候不用它. 1.delegate 基本特征: 一 个controller定义了一个协议(即一系列的方法定义).该协议描

iOS中delegate代理对象使用weak和assign哪个?

在定义delegate对象的时候,我们经常看到可以使用weak 和 assign 但是到底哪个使用更合适呢? 首先:使用assign,声明的对象即使对象销毁了,但是指针依然存在,这样造成声明的对象变成了野指针,这样导致内存泄露. 而使用 weak ,当对象销毁时,即将delegate = nil,这样不会产生野指针这种情况出现. 所以答案很明显 我们在定义代理对象的时候,通常使用weak来修饰.

iOS中KVO使用理解

什么是KVO KVO<NSKeyValueObserving>,是一个非正式协议,提供了一个途径,使对象(观察者)能够观察其他对象(被观察者)的属性,当被观察者的属性发生变化时,观察者就会被告知该变化. 基本使用 添加观察者: - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable v

ios中关于delegate(委托)的使用心得

从开始从事OC工作到现在大概1年多了,从当初接触oc的"协议"的不明白,到现在代码中随处可见的委托,协议,其中感悟颇多. 首先,大家应该都明白的是委托是协议的一种,顾名思义,就是委托他人帮自己去做什么事.也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法. 其次,我简单的总结了一下自己用到的委托的作用有两个,一个是传值,一个是传事件. 1.所谓传值经常用在b类要把自己的一个数据或者对象传给a类,让a类去展示或者处理.(切分紧耦合,和代码分块的

深入了解iOS中的VC切换的传值方式

由于上次面试中有提到相关内容,所以这次我专门深入研究了iOS的几种方式: 首先把所有的传值方式都列出来,如果有遗漏,请指正 首先列出iOS中使用的传值方式: init 传值(即在创建VC的时候就对响应的参数进行设置) property 传值(即属性赋值) Router 传值(这个在OC中被使用,因为作者没有写Swift版本,所以先开个坑,估计我会填坑) Delegate 传值(通过协议和代理传值) 闭包(block)传值 (通过swift中的闭包,类似于OC中的block传值) Notifica

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

ios学习-delegate.传值.跳转页面 1.打开xcode,然后选择ios--Application--Empty Application一个空项目. 项目目录: 2.输入项目名称以及选择保存路径即可. 3.创建文件夹Model.Controller. 4.Model文件夹创建User类:User.h User.m 代码: User.h: [html] view plaincopy #import <Foundation/Foundation.h> @interface User : N

iOS中NSNotification、delegate、KVO三者之间的区别与联系?

iOS中NSNotification.delegate.KVO三者之间的区别与联系? delegate.notification和KVO他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delegation: 2.通知中心Notification Center: 3.键值观察key value observing,K

iOS中多视图的传值 属性传值和代理传值

首先创建两个类 ,FirstViewController和SecondViewController,都继承于UIViewController 1 #import "AppDelegate.h" 2 #import "FirstViewController.h" 3 4 @interface AppDelegate () 5 6 @end 7 8 @implementation AppDelegate 9 10 11 - (BOOL)application:(UIAp