2012-04-08 54 views
0

在本質上,這是我在NSTextFieldCell的一個子類代碼:NSCell -stringValue調用-setStringValue?

- (void)setStringValue:(NSString *)aString { 
    [super setStringValue:aString]; 
    [self doSomething]; 
} 

- (void)doSomething { 
    NSLog(@"%@", [self stringValue]); 
} 

從本質上講,我試圖讓我的子類通知的字符串值的變化,而當值的變化,我想NSCell的子類能夠使用該新值進行操作(使用-attributedStringValue會更好,因爲我想將它緩存爲特殊繪圖)。問題是,出於某種原因,調用 - (NSString *)stringValue以某種方式導致調用 - (void)setStringValue結果變成...

...一個無限循環。有人能夠啓發我 - 可能的解決方法?

+0

你是怎麼調用stringValue的?我試過你的代碼,並沒有得到任何循環,它似乎工作正常。 – rdelmar 2012-04-08 23:34:10

+0

@rdelmar我正在使用stringValue的默認實現。也許我錯過了代碼中顯而易見的東西,但我只是寫了一個NSTextfieldCell的子類,它恰好位於NSTableView內(NSTextField綁定到TableCellView) – Vervious 2012-04-09 00:18:57

回答

1

可能stringValue正在做一些延遲初始化。如果它檢測到它沒有stringValue,但可以從別的東西(也許是attributedStringValue?)中推導出該值,則它會派生該值,然後調用[self setStringValue:derivedValue],然後返回該值。但是,這確實使生活變得棘手。嘗試這樣的?

@implementation MyCell() 
{ 
    BOOL gettingStringValue; 
} 
@end 

- (NSString*)stringValue { 
    gettingStringValue = YES; 
    NSString* stringValue = [super stringValue]; 
    gettingStringValue = NO; 
    return stringValue; 
} 

- (void)setStringValue:(NSString *)aString { 
    [super setStringValue:aString]; 
    if (!gettingStringValue) 
     [self doSomething]; 
} 
+0

這真是一個很好的解決方案 - 我希望我想到事先 - 謝謝! – Vervious 2012-04-09 00:23:45

+0

這不是我最喜歡的技巧 - 這種東西往往很脆弱 - 但有時它是唯一的方法...... – 2012-04-09 00:29:55