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

之前对于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地址:点击跳转

不喜勿喷,欢迎讨论。

posted @ 2017-07-12 19:49  __Feng  阅读(21053)  评论(1编辑  收藏  举报