KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践

一、KVC的传值

: KVC也就是key-value-coding(键值编码),简而言之就是通过key值去进行赋值和取值。主要是是操作对象的属性。

  • 几个常用的方法:
 * setValue:forKey:(为对象的属性赋值)
 * setValue: forKeyPath:(为对象的属性赋值(包含了 setValue:forKey:的功能,并且还可以对对象内的类的 属性进行赋值))
 * valueForKey:(根据key取值)
 * valueForKeyPath:(根据keyPath取值)

:补充:KVO的用法

KVO也就是key-value-observing(即键值观察),利用一个key来找到某个属性并监听其值得改变。用法如下:
  * 添加观察者
  * 在观察者中实现监听方法,   observeValueForKeyPath: ofObject: change: context:(通过查阅文档可以知道,绝大多数对象都有这个方法,因为这个方法属于NSObject)
  * 移除观察者
  • 效果实现
  • 那咋们废话少说,直接看看代码怎么实现,如下图所示是模拟器的效果,我要实现把第一个视图控制器里的Label里面的text传给下一个视图控制器的textField的text,然后编辑第二个视图控制器中的textField的text的值,再传给第一个视图控制器的过程。

  • 第一个视图控制器原始值
KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践_第1张图片
屏幕快照 2016-03-29 下午3.00.46.png
  • 第一个视图控制器传给第二个视图控制器的值
KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践_第2张图片
屏幕快照 2016-03-29 下午3.01.01.png
  • 编辑第二个视图控制器中的值
KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践_第3张图片
屏幕快照 2016-03-29 下午3.22.34.png
  • 第二个视图控制器传给第一个视图控制器的值
KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践_第4张图片
屏幕快照 2016-03-29 下午3.22.51.png

三、实战代码

KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践_第5张图片
屏幕快照 2016-03-29 下午3.26.00.png
KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践_第6张图片
屏幕快照 2016-03-29 下午3.26.23.png
  • 如果你想看详细的Demo,可以链接我的Github地址直接运行查看效果:https://github.com/sizhupo/jiajia/tree/master/%E5%87%A0%E7%A7%8D%E5%B8%B8%E8%A7%81%E7%9A%84%E4%BC%A0%E5%80%BCDemo ,水平有限,我们可以共同学习哦!

二、Block块的传值

:首先,我先说说我的传值过程:我想把第二个控制器中的textField的text文本用Block的方式传到第一个视图控制器里面的Label的text,请看下面:

KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践_第7张图片
屏幕快照 2016-03-30 下午3.47.06.png

:首先我定义了一个Block块:ChangeLabelValue作为第二个视图控制器的一个属性,用来把textField的text值在点击返回按钮的时候传给Label的text,所以在back的方法里面实现Block参数的传送(self.textField.text).

  • 在第一个控制器里面
KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践_第8张图片
屏幕快照 2016-03-30 下午3.54.52.png

:同样我也搞了一个Block块,是用来接收第二个视图控制器用Block块传过来的值的,如图所示注释:(//将第二个视图控制器的值传给第一个视图控制器)下面的Block方法,这样,再经过KVC的赋值,那么就可以在点击返回按钮的时候将第二个视图控制器里的值传给第一个视图控制器。

  • 如果你想看详细的Demo,可以链接我的Github地址直接运行查看效果:https://github.com/sizhupo/jiajia/tree/master/%E5%87%A0%E7%A7%8D%E5%B8%B8%E8%A7%81%E7%9A%84%E4%BC%A0%E5%80%BCDemo ,水平有限,我们可以共同学习哦!

三、协议的传值

:首先,我说说我的目的:我想把第一个视图控制器中的Label中的text传给第二个视图控制器里的textField中的text,那么顾名思义,给当前视图控制器即第一个视图控制器设置代理并实现协议的方法即可,所以我在第一个视图控制器中的.h文件里面先搞了一个协议(当然这个协议可以直接单独弄一个),如下图:

KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践_第9张图片
屏幕快照 2016-03-30 下午4.12.59.png

:接着在.m文件里面的点击下一页按钮的时候的方法里实现当前控制器中值的传送,首先获取第二个视图控制器对象,并且设置他为当前控制器的代理,如下图:

KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践_第10张图片
屏幕快照 2016-03-30 下午4.15.14.png

:接着在第二个视图控制器里面要遵从第一个视图控制器规定的协议并且实现协议中的方法,如图所示:

屏幕快照 2016-03-30 下午4.22.07.png
KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践_第11张图片
屏幕快照 2016-03-30 下午4.22.22.png

:那么这样,在点击第一个视图控制器中的按钮的并跳转到第二个视图控制器的时候,就会将Label的text传给第二个视图控制器中的textField的text

四、通知中心的传值

:老规矩,我想让第二个视图控制器中的textField的text值经过通知中心传给第一个控制器,那么我们直接往下看,首先在第一个视图控制器里面的viewDidLoad方法里面注册一个通知,如下图:

//3.注册一个通知(addObserver:通知的响应者,name:当前通知的名字,object:通知的发送者)
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ChangeNextLabelValue:) name:@"ChangeLabelValue" object:nil];
  • 通知的实现方法
//通知的方法
- (void)ChangeNextLabelValue:(NSNotification *)Notification
{
    NSLog(@"%@",Notification);
    NSDictionary *dic = Notification.userInfo;
    self.Label.text = dic[@"value"];
}

:接着在第二个视图控制器里面的返回前一页的方法里面发送一个通知:

//点击返回按钮所做的事
- (void)ForwardPages:(UIButton *)Button
{
   [self dismissViewControllerAnimated:YES completion:nil];
    //发送通知
    NSDictionary *dict = @{@"value":self.TextField.text};
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeLabelValue" object:self userInfo:dict];
}

:最后,记得销毁通知即可:

//销毁通知
- (void)CancelPages
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ChangeLabelValue" object:nil];
}

:那么这样,第二个视图控制器里面的值就会传给第一个视图控制器

  • 如果你想看详细的Demo,可以链接我的Github地址直接运行查看效果:https://github.com/sizhupo/jiajia/tree/master/%E5%87%A0%E7%A7%8D%E5%B8%B8%E8%A7%81%E7%9A%84%E4%BC%A0%E5%80%BCDemo ,水平有限,我们可以共同学习哦!

:最后,如果你觉得有啥疑问或者是可以帮助到你的,可以直接说哈!只希望我们大家共同进步!!!谢谢!

你可能感兴趣的:(KVC、Block块、协议(delegate)和通知中心(Notification)的传值实践)