2012-01-06 65 views
0

我有一個基於其他對象吐出一個字符串的對象的實例方法。我可以將此實例方法綁定到字段嗎?將NSTextField綁定到對象實例方法?

+3

不要忘記實現'keyPathsForValuesAffecting '。然後,以符合KVC的方式對所依賴的屬性所做的任何更改將自動觸發觀察該屬性的任何內容(如字段)以再次檢索它。 – 2012-01-06 01:27:58

回答

0

創建NSString屬性,打開nib文件並將文本字段的value綁定到該屬性。然後,您對該屬性所做的任何更改都將反映在文本字段中。

+1

您不必將其設爲@屬性。一個實例方法,只要它沒有參數,就會表現等價。 – ipmcc 2012-01-06 19:16:00

+0

但是,那麼你必須發出你自己的KVO通知,所以不,它不會有相同的行爲。 – 2012-01-06 19:49:57

+0

不正確。嘗試一下。聲明爲: - (NSString *)的值; - (void)setValue:(NSString *)value;並定義爲 - (NSString *)value {return _value; } - (void)setValue:(NSString *)value {if(![_ value isEqualToString:value]){[_value autorelease]; _value = [值保留]; }}我確定在設置值時會得到KVO通知。 – ipmcc 2012-01-06 21:36:32

0

只有在爲綁定實現相應的setter方法以嘗試將中的更改寫入to時,才能將getter instance方法綁定到該字段的值。 (對於其他一些綁定類型,不需要setter)

setter是空的。

例如,這是用於跨實例的子樹顯示新項目的數量:

- (NSNumber*) numberOfNewItems 
{ 
    NSUInteger total = 0; 

    for (childItem* ci in self.items) 
     total += (ci.isNewValue) ? ci.items.count : 0; 

    return @(total); 
} 

// Does nothing but allows binding to above to be recalculated 
- (void) setNumberOfNewItems:(NSNumber*)number { } 

,使一個綁定2路幸福。如果你沒有setter,你會得到與keypath不兼容的錯誤。 (除非你像「標題」或「工具提示」那樣單向綁定 - 不需要setter,但setter可以方便地通過getter來重新計算這些標題和工具提示)

Note該childItems內,然後你可以只是這樣做:

self.isNewValue = NO; 
[self.parent setNumberOfNewItems:nil]; // Trigers KVO for binding (does nothing else) 

...這比試圖讓父寄存器作爲國際志願者組織觀察員所有的孩子更容易了很多。

如果你想在實例中的其他屬性重新觸發吸氣,你可以添加這個類方法:

+ (NSSet *)keyPathsForValuesAffectingNumberOfNewItems { 
    return [NSSet setWithObjects:@"items", @"somethingElse", nil]; 
}