ios 监听一个控制器的属性_iOS中的几种监听方法

发送通知

发送通知的目的是用来给外部一些信息,供外部的控制器来监听发送通知的对象内部的一些行为。

//某人发送了一个名为大新闻的通知,通知附带内容info

NSNotification *note = [NSNotification notificationWithName:@“大新闻” object:self userInfo:

@{ @“time” : @“2015.6.1"

@“desc” : @“也没什么大新闻"

}];

[[NSNotificationCenter defaultCenter] postNotification:note];

有人发送,就会有人接收,假设有另一个模拟机接收通知:

[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

监听某个行为,第一反应:用代理来监听行为

以下两个方法都能监听行为:

观察者模式(通知机制)

代理模式:如何设计一个代理模式?

代理模式

定义一个协议:

协议的格式:控件名 + Delegate,在协议里面声明一些代理方法(一般代理方法都是@optional)

按照苹果官方的命名样式来定义方法名:

@protocol JWLoadMoreFooterDelegate

@optional

-(void)loadMoreFooterDidClickLoadMoreButton:(JWLoadMoreFooter *)footer;

声明代理属性

@property (nonatomic, weak) id delegate;

想要用代理方法,就要遵循代理的协议

用weak是防止出现循环引用。

原理图如下:

Snip20150606_22.png

在内部发生某些行为时,调用代理对应的代理方法,通知代理内部发生什么事

设置代理,(先让控制器称为footer的代理)

footer.delegate = self;

遵守协议

调用代理中的方法

[self.delegate loadMoreFooterDidClickLoadMoreButton:self];

总结:设置了代理以后,可以监听代理方法

如果你想监听别人的一些行为,那么就要称为别人的代理;

如果你想告诉别人一些内部的事情,那么就让别人称为你的代理。

使用者:遵守协议—>设置代理—>使用代理中的方法来监听

告诉代理有没有实现这个方法

if([self.delegate respondsToSelector:@selector(…)]){

[self.delegate loadMoreFooterDidClickLoadMoreButton:self];

}

如果实现这个方法,那么就调用这个代理方法。如果没有实现就不调用。

代理和通知的区别

代理:1个对象只能告诉1个代理

通知:1个对象可以告诉多个代理,内部只要发了一个通知,外部只要有人接收都可以监听到。

另一种监听方式-KVO

KVO(Key Value Observing)

常用作用:监听模型属性值的改变

下面是KVO的一个例子,细节的说明已经写在注释当中:

self.p1 = [[JWPerson alloc] init];

self.p1.name = @“p1”;

//self监听了self.p1的name属性的改变

[self.p1 addObserver:self forKeyPath:@"name" options: NSKeyValueObservingOptionOld context:nil];

self.p1.name = @"pppp1";

#pragma mark - KVO监听方法

//self得实现监听方法

/**

*当监听到object的keyPath属性发生了改变

*/

//这个方法继承于NSObject,所以不需要遵守其他协议,任何对象都可以调用这个方法

//改变了object的哪个值(KeyPath),改成了什么(字典change)

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

NSLog(@"监听到%@对象的%@属性发生了改变, %@", object, keyPath, change);

}

总结KVO:

对象自己添加观察者,监听对象的属性的改变

KVC:常见作用:给模型属性赋值

注意点

无论是KVO还是通知,监听完后都要将观察者销毁

-(void)dealloc

{

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

addTarget方法

addTarget方法是最基本的监听方法,对象可以调用该方法,实现对其他对象的监听,同时也可以设置调用其他的方法。

- (void)addTarget:(id)target action:(SEL)action

注:如有错误,请及时和我交流。感谢批评指正~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值