0

本质上,这是我在 NSTextFieldCell 子类中的代码:

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

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

本质上,我试图让我的子类通知字符串值的变化,当值发生变化时,我希望 NSCell 的子类能够使用该新值做一些事情(使用 -attributedStringValue 会更好,因为我想缓存它以供特殊绘图)。问题是,由于某种原因,调用 -(NSString *)stringValue 会导致调用 -(void)setStringValue 最终变成......

...无限循环。有人可以启发我 - 以及可能的解决方法吗?

4

1 回答 1

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];
}
于 2012-04-08T23:00:49.417 回答