0

我从我的一个名为 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). google了之后,我发现原因是关键字forKeyPath。如果我把它改成contentOffset,一切都像魅力一样。

在这里做了一个快速的研究,但仍然不明白为什么。

4

1 回答 1

1

请参阅Apple 关于 KVO 的基本文档

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

好吧,UIScrollView 有一个contentOffset属性。所以它是符合. contentOffset因此,您可以观察到该属性的更改,如果您将密钥路径设置为contentOffset.

UIScrollView 没有notification属性,所以它的notification属性永远不会改变,所以如果你将 key path 设置为notification.

这是我书中的解释:

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

于 2013-05-03T15:07:14.477 回答