举例如下:
Project *project = [[Project alloc] init];
project.title = @"MyProject";
project.field = @"SomeOtherField";
我想在更改属性时设置标志。当通过点语法完成属性更改时,有没有办法可以做到这一点?
我可以覆盖
- (void) setValue:(id)value forKey:(NSString *)key
使用KVC设置对象属性:
[project setValue:@"SomeOtherField" forKey:@"field"];
但点语法总是看起来更干净;)
谢谢!
答案 0 :(得分:5)
如果要对多个属性/对象执行此操作,请使用Key-Value Observing
。
以观察员身份注册:
[project addObserver:self
forKeyPath:@"title"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOldKey)
context:NULL];
实施变更处理程序
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([object isKindOfClass:[Project class]] && [keyPath isEqual:@"title"]) {
//do something with [change objectForKey:NSKeyValueChangeNewKey];
}
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
答案 1 :(得分:2)
点语法obj.var = x转换为[obj setVar:x]。因此,要创建方法,要覆盖点 - (void)setVar:...
我做了很多。
答案 2 :(得分:1)
使用属性时,您可以使用setTitle
并使用project.title
。
- (void) setTitle:(NSString *)title;