2010-11-22 12 views
14

Wchodząc nieprawidłowy e-mail w Poczcie za NSTokenField dostać za to (a mieszanką tokena i zwykłego łańcucha wartości):NSTokenField z mieszanym wejściem token/string, możliwe?

alt text

Czy istnieje polecenia drogą do osiągnięcia tego celu?
Czy NSTokenField jest odpowiednim narzędziem do tego? A może nadużywałbym tego?

W tym konkretnym projekcie muszę pozwolić użytkownikowi wprowadzić nazwę pliku sygnatur
(istnieje kilka innych przypadków użycia chociaż), ze wsparciem dla predefiniowanych żetonów.

Teraz jestem wymagająca wejście do wprowadzenia tak:

Glue Text %[Tag]Other Glue Text%[Another Tag]More Text 

Chciałbym zmienić to w pewnym idiotoodporny graficznego rozwiązania jak ten: alt text

NSTokenField zawsze (!) zamienia wpisany tekst na tokeny.

Albo używam złych słów kluczowych w moich wyszukiwaniach internetowych,
lub jestem naprawdę pierwszy, który potrzebuje tego (mieszanego) zachowania ?!

Przeczytałem przez NSTokenField Guide firmy Apple, ale nie mogłem znaleźć żadnych informacji na temat mojego problemu.

Odpowiedz

12

Musisz zastosować metodę delegowania tokenField:styleForRepresentedObject:, aby zwrócić NSRoundedTokenStyle dla tokenów lub NSPlainTextTokenStyle dla innego tekstu. Przedstawiony obiekt tokena to sam ciąg znaków, chyba że delegat zwróci inne obiekty.

To powinno załatwić sprawę w Twoim przypadku:

- (NSTokenStyle)tokenField:(NSTokenField *)tokenField 
styleForRepresentedObject:(id)representedObject 
{ 
    if ([representedObject rangeOfString: @"%["].location == 0) { 
     return NSRoundedTokenStyle; 
    } else { 
     return NSPlainTextTokenStyle; 
    } 
} 
+0

Dzięki, to wszystko! – Regexident

2

Faktycznie, trzeba najpierw zdefiniować charakter tokenizing, który w danym przypadku byłby%

[tokenField setTokenizingCharacterSet:[NSCharacterSet characterSetWithCharactersInString:@"%%"]]; 

Ciąg wejściowy musi zmieniło się również na:

Tekst kleju% [Znacznik]% Inny klej Tekst% [Inny znacznik]% Więcej tekstu

... aby Kakao wiedziało, gdzie kończy się żeton.

A jeśli chcesz [Tag] ma być wyświetlany jako znacznik w polu tokena, należy również wdrożyć metodę tokenField:displayStringForRepresentedObject::

- (NSTokenStyle)tokenField:(NSTokenField *)tokenField 
displayStringForRepresentedObject:(id)representedObject 
{ 
    if ([representedObject rangeOfString: @"["].location == 0) { 
     return [(NSString*)representedObject substringWithRange:NSMakeRange(1, [(NSString*)representedObject length]-2)]; 

    return representedObject; 
} 

to jednak ma duży wada: jeśli kopiowanie lub po prostu przenieść token, kakao zadzwoni pod numer tokenField:displayStringForRepresentedObject:, a skopiowany/przeniesiony token zostanie zmieniony na zwykły tekstowy znacznik zamiast tokena [znacznik].

Jeśli ktoś ma rozwiązanie powyższego problemu, chętnie go przeczytam.

+0

Musisz zaimplementować metodę delegatów - (BOOL) tokenField: (NSTokenField *) tokenField writeRepresentedObjects: (NSArray *) obiekty toPasteboard: (NSPasteboard *) pboard – Pol

Powiązane problemy