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 に答える