iOS开发--传值方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河丘壑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值