2010-11-15 60 views
1

举个例子如下:Objective-C - 有没有办法“重写”点语法?

Project *project = [[Project alloc] init]; 
project.title = @"MyProject"; 
project.field = @"SomeOtherField"; 

我想只要属性更改设置一个标志。有没有什么办法可以通过点语法完成属性更改?

可以只是简单地覆盖

- (void) setValue:(id)value forKey:(NSString *)key 

而且使用KVC设置对象的属性:

[project setValue:@"SomeOtherField" forKey:@"field"]; 

但点语法总是看起来比较清爽;)

谢谢!

回答

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

学到了新东西。 Thnks。 – mmilo 2010-11-15 02:23:42

1

当使用属性,你可以有setTitle,并将其与project.title工作。

- (void) setTitle:(NSString *)title; 
2

点语法obj.var = x被转换为[obj setVar:x]。所以为了覆盖点就实现了创建方法 - (void)setVar:...

我做了很多。

相关问题