2010-11-15 44 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:...

我做了很多。

相關問題