2010-12-05 8 views
0

Ich habe ein NSTokenField mit NSTokenFieldCells, die verwaltete Objekte darstellen. Wenn ich ein neues NSTokenFieldCell durch Eingabe erstellen, zu delegieren mein NSTokenField der (ein NSArrayController) aufgerufen werden mit dieser Methode zurück:Rückruf zum Löschen von NSTokenFieldCell

tokenField:representedObjectForEditingString 

Bei dieser Methode ich ein verwaltete Objekt für die neue Token-Zelle und es funktioniert wie erwartet.

Ich kann jedoch keine Rückrufmethode zum Löschen einer NSTokenFieldCell finden, wo ich mein verwaltetes Objekt entfernen kann. Wer weiß, ob das existiert? Wenn nicht, würde ich das NSTokenField irgendwie auf Löschungen hin überwachen müssen, die nicht ideal klingen.

Antwort

1

Es ist schwer zu verstehen, wonach genau Sie fragen. Meinst du wirklich, du erstellst und löschst NSTokenFieldCells? Ich glaube nicht, dass Sie das tun - ein NSTokenField-Steuerelement verfügt über eine NSTokenFieldCell-Instanz. Die gesamte Assembly repräsentiert nur bestimmte Strings (die Sie über das NSTokenFieldDelegate-Protokoll steuern) als grafische "Tokens". Die Zelle wird nicht jedes Mal neu erstellt, sondern nur, was sie darstellt/zeichnet.

Möchten Sie benachrichtigt werden, wenn eine Token-Zeichenfolge aus dem Feld gelöscht wird? Wenn dem so ist, fürchte ich, dass es nicht so funktioniert. Sie Sie entscheiden, welche Zeichenfolgen (getrennt durch den Token-Zeichensatz, den Sie das zu verwendende Token-Feld angegeben haben) und die Ersatzzeichenfolge (normalerweise eine gekürzte oder bereinigte Version) als Token angezeigt werden. Daher ist es bis zu Sie zu bestimmen, ob ein "Token", das in Ihrem Modell ist jetzt fehlt und reinigen Sie es selbst.

Einfach ausgedrückt: Es gibt keine Möglichkeiten, dies in Cocoa Bindings zu tun. Am besten ist es, ein "-tokensNeedCleaning" -Flag beizubehalten und es so zu behandeln, wie die Methoden -setNeedsDisplay: und -displayIfNeeded mit NSView arbeiten. Auf diese Weise können Sie, wenn das Tokenfeld bearbeitet wird, [self setTokensNeedCleaning: YES] aufrufen. Diese Methode kann wiederum "[self cleanTokensIfNeeded]" über -performSelector: withObject: afterDelay: (mit einer Verzögerung von null Sekunden) aufrufen, um die Bereinigung der fehlenden Tokens zu planen, wenn das needsCleaning-Flag YES ist. Es wird dann die Flagge unkenntlich machen.

Dieser einfache Mechanismus verhindert, dass die Bereinigungsroutine bei jeder folgenden Änderung ausgeführt wird, sondern kennzeichnet sie und plant sie so, dass sie in der unmittelbaren Zukunft ausgeführt wird, wenn sie noch benötigt wird. Auf diese Weise werden aufeinanderfolgende geplante Aufrufe an -cleanTokensIfNeeded nicht ständig versuchen, aufzuräumen - die Bereinigungsaufrufe werden zusammengeführt.

+0

Sorry für die Verwirrung.Sie können davon ausgehen, dass ich benachrichtigt werden möchte, wenn eine in Token enthaltene Zeichenfolge aus dem Feld gelöscht wird. Dein TokensNeedCleaning Flag-Setup klingt wie eine vernünftige Lösung. Ich bin jedoch in ein neues Problem geraten. Um festzustellen, welche Token-Strings gelöscht wurden, muss der gespeicherte Wert mit dem Formularwert verglichen werden. Wenn ich den Wert meines Formulars durch Aufruf von objectValue auf meinem NSTokenField erhalte, wird sein Delegat gesendet tokenField: reprotectedObjectForEditingString: der eingerichtet ist, um ein neues Token zu speichern. – tassock

+0

Ich fand objectValue nicht TokenField ausgelöst: reprodedObjectForEditingString: wenn in TextDidEndEditing aufgerufen. Ich bin alles Set erstellen und löschen Sie die Funktionalität für meine NSTokenField. Danke für die Anleitung! – tassock

0

antwortete ich nur diese Frage in einem anderen Thema, dass man tot zu sein scheint, so werde ich hier beantworten:

Sie sollten einen Lösch Delegierten simulieren können, indem ein Token-Wrapper-Klasse zu schaffen, die einen Zeiger hat zurück an den Eigentümer sowie die verpackte Objekt:

@protocol TokenWrapperDelegate 
-(void)tokenWasDeleted:(id)token; 
@end 

@interface TokenWrapper : NSObject { 
    id<TokenWrapperDelegate> owner; 
    id token; 
} 
-(id)initWithWrappedToken:(id)token owner:(id<TokenWrapperDelegate>)owner; 
@property (nonatomic, weak) id<TokenWrapperDelegate> owner; 
@property (nonatomic, strong) id token; 
@end 

Dann wird der TokenWrapper dealloc den Besitzer benachrichtigen haben, dass das Token gelöscht wurde:

@implementation TokenWrapper 

... 

-(void)dealloc { 
    [owner tokenWasDeleted:self.token]; 
    self.token = nil; 
    [super dealloc]; 
} 

@end 

Dann geben Sie in Ihrem representedObjectForEditingString Callback einen automatisch freigegebenen Wrapper zurück, der auf Ihren Besitzer und Ihr echtes Token zeigt. Sie müssen auch sicherstellen, dass Sie die anderen NSTokenField-Delegatenrückrufe so ändern, dass Sie sich in das Wrapperobjekt vertiefen. Stellen Sie sicher, dass der Besitzer ein wenig setzt, um diese Rückrufe zu ignorieren, wenn Sie den Inhalt von NSTokenField manuell ändern (z. B. durch Aufrufen von setObjectValue).

+0

1), aber wie man dieses bestimmte Token von repretedObjectForEditingString bekommt: ??? 2) Wenn ich dieses Token auch dann bekomme, wenn ich nur editiere, dann seine Aufruf - (void) tokenWasDeleted: (id) Token; Methode. Ansonsten, wenn ich auswählen und direkt lösche. es wird nicht anrufen. Dann, wie ich dieses bestimmte Token bekommen werde. –

Verwandte Themen