2010-11-22 15 views
14

Al entrar en un correo electrónico válida en el de correo NSTokenField uno de conseguir esto (una mezcla de token de cadena sencilla y valores):NSTokenField con entrada mixta de token/cadena, posible?

alt text

¿Hay alguna manera recomendable para lograr esto?
¿Es NSTokenField incluso la herramienta adecuada para esto? ¿O lo estaría abusando?

En este proyecto en particular me deben permitir que el usuario introduzca un patrón de nombre de archivo
(hay varios otros casos de uso, aunque), con soporte para los tokens predefinidos.

En este momento estoy requiriendo la entrada a introducirse así:

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

me gustaría cambiar esto en cierta solución gráfica a toda prueba como esta: alt text

NSTokenField siempre (!) convierte el texto ingresado en tokens.

O estoy usando las palabras clave incorrectas en mis búsquedas web,
o soy realmente el primero en necesitar este comportamiento (mixto)?

Lo leí a través de la guía NSTokenField de Apple, pero no pude encontrar ninguna información sobre mi problema.

Respuesta

12

Debe implementar el método delegado tokenField:styleForRepresentedObject: para devolver NSRoundedTokenStyle para tokens o NSPlainTextTokenStyle para otro texto. El objeto representado para un token es la cadena token en sí, a menos que su delegado devuelva otros objetos.

Esto debería hacer el truco para su caso:

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

Gracias, eso es todo! – Regexident

2

En realidad, primero hay que definir un carácter tokenizing, que en su caso sería%

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

La cadena de entrada necesita cambiado también en:

Pegamento Texto% [Etiqueta]% Otro pegamento Texto% [Otra etiqueta]% Más texto

... para que Cocoa sepa dónde termina el token.

Y si quieres [Etiqueta] que se mostrará como etiqueta en el campo token, también es necesario para implementar el tokenField:displayStringForRepresentedObject: método:

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

    return representedObject; 
} 

Sin embargo, esto tiene un gran inconveniente: si copia o simplemente mueva un token, Cocoa llamará al tokenField:displayStringForRepresentedObject: y el token copiado/movido se cambiará a Etiqueta de texto normal en lugar de al token [Etiqueta].

Si alguien tiene una solución para el problema anterior, me gustaría leerlo.

+0

Necesita implementar el método delegado - (BOOL) tokenField: (NSTokenField *) tokenField writeRepresentedObjects: (NSArray *) objetos aPasteboard: (NSPasteboard *) pboard – Pol

Cuestiones relacionadas