提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
KVO传值,通知传值,Block传值
KVO传值
KVO:keyValueobserve观察者模式。是一种开发模式
是apple体重的一套事件通知机制,允许对象坚挺林会更勇敢对应特设的属性的改变。并在改变时接受到改事件。一般继承自NSObject的对象默认支持KVO
KVO可以监听单个属性的变化,也可以监听集合对象的变化。
使用步骤
- 注册观察者
@observe:观察者,被观察对戏那个发生改变时通知的接收者
@keyPath:被贯彻的属性名
@options:有四个类型:一般情况选择前两个进行使用
NSKeyValueObservingOptionNew
返回改变后的新值
NSKeyValueObservingOptionOld
返回改变前的旧值
NSKeyValueObservingOptionInitial
注册时发一次通知,改变后在发一次通知
NSKeyValueObservingOptionPrior
改变前发一次通知,改变后发一次通知
@context:可传入任何类型的对象,这个值会传递到接受消息回掉的代码中。
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
- 设置所观察的属性发生改变时调用的函数
@keyPath:被观察者的属性名
@object:观察对象
@change:字典类型的值,通过键值对显示新的属性值和旧的属性值
@context:传递信息
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
- 移除观察者
@observer:观察者
@keyPath:想要观察的对象属性
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath
特点
KVO是通过监听
settler
方法阿里实现的。当监听一个不属于setter方法的方法时,不会有监听反应
通知传值
通知传值可以跨越多个页面传值,和协议传值相似的是一般是由后面的页面传值给前面的页面
使用步骤
- 在B页面(发送者)实现一个方法发送通知
@ postNotificationName:通知的名字,和接收者的名字一样
@object:接收对象
@userInfo:字典类型的数据,是要携带的参数
[NSNotificationCenter defaultCenter] postNotificationName:<#(nonnull NSNotificationName)#> object:<#(nullable id)#> userInfo:<#(nullable NSDictionary *)#>
- 在A页面(接收者)中注册通知。接收者和发送者的名字要一致
这里name要和上面的name参数一致
[NSNotificationCenter defaultCenter] addObserver:<#(nonnull id)#> selector:<#(nonnull SEL)#> name:<#(nullable NSNotificationName)#> object:<#(nullable id)#>
-
在A页面(接收者)中实现通知中的方法(上面的@selector的方法)
-
在不用的时候移除通知
//移除某个通知
[NSNotificationCenter defaultCenter]removeObserver:<#(nonnull id)#> name:<#(nullable NSNotificationName)#> object:<#(nullable id)#>
//移除所有通知
[[NSNotificationCenter defaultCenter]removeObserver:self];
Block传值
Block传值和协议传值都适用于从后一个界面向前一个界面传值(反向传值)
Block块:将函数及其执行上下文封装起来的对象,block块的调用就是函数的调用
- 在B.h中进行block的声明
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef void(^block)(NSString* string);
@interface second : UIViewController
@property (nonatomic,strong)NSString* string;
@end
NS_ASSUME_NONNULL_END
- 在B.m中的B页面跳转回A页面的按钮事件函数中,使用刚才定义的block,把需要传递的值放进^block()中
- (void)pressback {
_newblock(_string);
[self dismissViewControllerAnimated:YES completion:nil];
}