IOS 知识积累

iOS中的几种监听方法

2015-06-22  本文已影响7355人  coderJerry

发送通知

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

//某人发送了一个名为大新闻的通知,通知附带内容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];

代理模式

@protocol JWLoadMoreFooterDelegate <NSObject>
@optional
-(void)loadMoreFooterDidClickLoadMoreButton:(JWLoadMoreFooter *)footer;
@property (nonatomic, weak) id<JWLoadMoreFooterDelegate> delegate;

想要用代理方法,就要遵循代理的协议
用weak是防止出现循环引用。
原理图如下:


Snip20150606_22.png
footer.delegate = self;
<JWLoadMoreFooterDelegate>
[self.delegate loadMoreFooterDidClickLoadMoreButton:self];

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

代理和通知的区别

另一种监听方式-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);
}
-(void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

addTarget方法

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

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

上一篇 下一篇

猜你喜欢

热点阅读