我从我的一个名为UIScrollView(Sample)的类(uiscroll视图的类别)中注册了一个名为myClassA(uiview的子类)的类的观察者
@implementation UIScrollView (myClass)
// Register an observer
- (void)registerAsObserver {
[self addObserver:[self getMyClassA] forKeyPath:@"notification" options:NSKeyValueObservingOptionNew context:nil];
}
在myClassA
中@implementation myClassA
- (id)initWithFrame:(CGRect)frame {
if(self = [super initWithFrame:frame]) {
// Initialization goes here
}
return self;
}
#pragma mark - Receive notification of change
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
CGPoint newPoint = [[change objectForKey:NSKeyValueChangeNewKey] CGPointValue];
if ( [keyPath isEqualToString:@"notification"] ) {
[self doSomething:newPoint];
}
}
但是,似乎myClassA没有收到来自UIScrollView(myClass)
的任何通知。谷歌之后,我发现原因是关键字 forKeyPath 。如果我把它改成contentOffset
,一切都像魅力一样。
在here进行了快速研究,但仍然不明白为什么。
答案 0 :(得分:1)
请参阅Apple's basic documentation on KVO:
使用KVO,一个对象可以观察到另一个对象的属性
嗯,UIScrollView有一个contentOffset
属性。因此contentOffset
符合密钥值编码。因此,您可以观察对该属性的更改,如果您将关键路径设置为contentOffset
,那就是您要做的事情。
UIScrollView没有notification
属性,因此其notification
属性永远不会更改,因此如果将关键路径设置为notification
,则无需观察。
以下是我的书中的解释: