2012-04-08 37 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