无法接收变更通知,关键值观察,KVO模型-IOS

时间:2013-05-03 15:00:19

标签: ios objective-c key-value-observing objective-c-category

我从我的一个名为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进行了快速研究,但仍然不明白为什么。

1 个答案:

答案 0 :(得分:1)

请参阅Apple's basic documentation on KVO

  

使用KVO,一个对象可以观察到另一个对象的属性

嗯,UIScrollView有一个contentOffset属性。因此contentOffset符合密钥值编码。因此,您可以观察对该属性的更改,如果您将关键路径设置为contentOffset,那就是您要做的事情。

UIScrollView没有notification属性,因此其notification属性永远不会更改,因此如果将关键路径设置为notification,则无需观察。

以下是我的书中的解释:

http://www.apeth.com/iOSBook/ch13.html#_key_value_observing