2012-04-08 6 views
0

Im Wesentlichen ist hier mein Code in einer Unterklasse von NSTextFieldCell:NSCell -stringValue ruft -setStringValue auf?

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

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

Im Grunde versuche ich meine Unterklasse in der Zeichenfolge Wert einer Änderung benachrichtigt zu bekommen, und wenn sich der Wert ändert, möchte ich die Unterklasse von NSCell, um etwas mit diesem neuen Wert machen zu können (Die Verwendung von -attributedStringValue wäre sogar noch besser, weil ich sie für spezielle Zeichnungen zwischenspeichern möchte). Das Problem ist, aus irgendeinem Grund Aufruf von - (NSString *) stringValue führt zu einem Aufruf von - (void) setStringValue, die am Ende wird ...

... eine Endlosschleife. Kann mir das jemand aufklären - und eine mögliche Abhilfe?

+0

Wie rufen Sie StringValue auf? Ich habe deinen Code ausprobiert, und ich habe keine Schleife bekommen, es schien gut zu funktionieren. – rdelmar

+0

@rdelmar Ich verwende die Standardimplementierung von stringValue. Vielleicht habe ich etwas Offensichtliches in meinem Code verpasst, aber ich schreibe gerade eine Unterklasse für eine NSTextfieldCell, die sich zufällig in einer NSTableView befindet (mit dem NSTextField an die TableCellView gebunden) – Vervious

Antwort

1

Wahrscheinlich macht stringValue einige faul Initialisierung. Wenn es erkennt, dass es keine stringValue hat, aber den Wert von etwas anderem ableiten kann (vielleicht attributedStringValue?), Leitet es den Wert ab, ruft auf und gibt dann den Wert zurück.

Dies macht das Leben jedoch schwierig. Versuchen Sie so etwas?

@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

Das ist eine wirklich nette Lösung - ich wünschte, ich hätte daran gedacht das vorher - danke! – Vervious

+0

Es ist nicht meine Lieblings-Technik - diese Art von Ding neigt dazu, ziemlich zerbrechlich zu sein - aber manchmal ist es der einzige Weg ... –

Verwandte Themen