CIF*_*ter 6 notifications properties objective-c key-value-observing
简而言之,当Objective-C类中的任何属性发生变化时,有没有办法接收一般通知?我知道我可以使用KVO来监视特定的属性更改,但是每当有任何setProperty:消息发送到我的类时,我都需要调用特定的方法.我希望能够收到通用通知,而不必担心特别修改了哪个属性.
如果它有助于澄清我为什么要这样做,我正在使用这里找到的一些快速表格滚动代码:http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview /
完成此操作的部分过程是,只要修改了表视图单元格中的属性,就[ self setNeedsDisplay ]需要调用它.我宁愿不必为我的类中的每个属性重写setter方法来进行这个调用.
正如Chuck所说,你可以创建一个从属密钥,或者当然你可以直接观察所有的属性(这比重载setter的工作少).
使用Objective-C运行时,如果您专门使用属性,则可以使用自动执行此过程class_copyPropertyList().但是,如果这个问题对你来说有点问题,我可能只会这样做.如果你只有这个问题的一个实例,那么直接观察属性列表可能更容易,更安全,更易于维护,除非你想在ObjC运行时工作.
这是根据 Chuck 和 Rob 的建议构建的示例:
德雷克对象.h
@interface DrakeObject : NSObject
@property (nonatomic, strong) NSNumber *age;
@property (nonatomic, strong) NSNumber *money;
@property (nonatomic, strong) NSString *startPosition;
@property (nonatomic, strong) NSString *currentPosition;
@property (nonatomic, strong, readonly) id propertiesChanged;
@end
Run Code Online (Sandbox Code Playgroud)
德雷克对象.m
@implementation DrakeObject
- (instancetype)init {
self = [super init];
if (self) {
self.age = @25;
self.money = @25000000;
self.startPosition = @"bottom";
self.currentPosition = @"here";
}
return self;
}
- (id)propertiesChanged {
return nil;
}
+(NSSet *)keyPathsForValuesAffectingPropertiesChanged {
return [NSSet setWithObjects:@"age", @"money", @"startPosition", @"currentPosition", nil];
}
Run Code Online (Sandbox Code Playgroud)
观察propertiesChanged会让我们知道属性何时发生变化。
[self.drakeObject addObserver:self
forKeyPath:@"propertiesChanged"
options:NSKeyValueObservingOptionNew
context:nil];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4501 次 |
| 最近记录: |