objective-c - 回应二传手

标签 objective-c cocoa

调用属性 setter 时响应数据更改的最佳方式是什么。例如,如果我有一个名为 data 的属性,当 [object setData:newData] 被调用时我该如何 react 并仍然使用合成的 setter。本能地,我会像这样覆盖合成的 setter:

- (void)setData:(DataObject *)newData {
    // defer to synthesised setter
    [super setData:newData];

    // react to new data
    ...
}

...但这当然没有意义 - 我不能像这样使用 super。那么处理这种情况的最佳方法是什么?我应该使用 KVO 吗?还是别的?

最佳答案

有几种不同的方法可以做到这一点,具体取决于您想要的控制程度。一种方法是观察您自己的属性(property):

[self addObserver:self forKeyPath:@"data" options:0 context:nil];

- (void)observeValueForKeyPath:(NSString *)path ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if(object == self && [path isEqualToString:@"data"]) {
        //handle change here
    } else [super observeValueForKeyPath:path ofObject:object change:change context:context];
}

确保在 dealloc 或 finalize 方法中将自己作为观察者移除,如果不是之前的话。

另一种方法是覆盖 -didChangeValueForKey:。但是,如果对象上没有观察者,则可能不会调用此方法。

- (void)didChangeValueForKey:(NSString *)key {
    [super didChangeValueForKey:key];
    if([key isEqualToString:@"data"]) {
        //handle change here
    }
}

关于objective-c - 回应二传手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4710340/

相关文章:

iphone - 如何使用 UIPanGestureRecognizer 移动对象? iPhone/iPad

ios - 核心数据和 GCD : Passing the correct managed object context to custom NSManagedObjects

带包的 Cocoa 应用程序框架

objective-c - 如何让[NsApp run]不被阻塞?

ios - NSLocalized 从字符串文件创建不同的字符串

iphone - 如何通过在 Tableview Customcell 中单击 ScrollView 来执行操作

ios - CLLocationManager坐标

cocoa - 如何在 cocoa 中创建自定义标题窗口

cocoa - 独立重用已声明的强大属性

objective-c - 从 NSBezierPath 中切出一个矩形