2011-08-16 20 views
7

Tengo un NSTokenField que permite al usuario seleccionar contactos (al igual que en Mail.app). Entonces NSTextField está vinculado a una matriz en mi variable de instancia model.recipient.NSTokenField no comprueba token en desenfoque

El usuario ahora puede seleccionar una entrada de la lista de autocompletado, p. Joe Bloggs: [email protected] y tan pronto como llegue a Ingrese se muestra el token (Joe Bloggs) y model.recipients ahora contiene una entrada BBContact.

Ahora bien, si el usuario comienza a escribir algunas de las claves (por lo que se muestran las sugerencias) y luego golpea Tab en lugar de Introduzca el token con el valor del texto finalización se crea (Joe Bloggs: [email protected]) y los métodos NSTokenFieldDelegate no recibió llamados, para poder responder a este evento La entrada model.recipient ahora contiene una entrada NSString en vez de una entrada BBContact.

Curiosamente, el método delegado tokenField:shouldAddObjects:atIndex: no se llama, que es lo que esperaría cuando el usuario elimine las pestañas del campo token.

enter image description here

Respuesta

6

Al presionar la ficha llama a esValidObject en el delegado, así que devuelve NO para NSTokenField en él, pero desea devolver SÍ si no tiene caracteres alfanuméricos, de lo contrario el usuario no podrá enfocar fuera del campo (la cadena contiene caracteres Unicode invisibles en función de cómo existen muchas fichas)

la implementación menos frágil que podría llegar a es:

- (BOOL)control:(NSControl *)control isValidObject:(id)token 
{ 
    if ([control isKindOfClass:[NSTokenField class]] && [token isKindOfClass:[NSString class]]) 
    { 
     if ([token rangeOfCharacterFromSet:[NSCharacterSet alphanumericCharacterSet]].location == NSNotFound) return YES; 
     return NO; 
    } 
    return YES; 
} 
-1

Esto podría deberse a que la tecla "enter" podría enviar el caso de que el campo de contadores a su acción en la tecla "Tab" sólo añade el texto a él. Podría intentar establecer la propiedad -isContinuous en SÍ y ver si obtiene los resultados deseados.

+0

Eso sonaba prometedor, así que intentaron rápidamente, pero el problema persiste, así que todavía tengo el mismo comportamiento. – Besi

+0

Lo tengo trabajando ahora usando la devolución de llamada 'isValidObject' – Besi

0

que era capaz de resolver el problema con las sugerencias de @ valexa. En caso de borrosidad con TAB tengo que revisar todas las entradas y buscar mis cadenas de contactos para ver si hay alguna cadena.

- (BOOL)control:(NSControl *)control isValidObject:(id)token{ 
    if ([control isKindOfClass:[NSTokenField class]] && [token isKindOfClass:[NSString class]]) 
    { 
     NSTokenField *tf = (NSTokenField *)control; 

     if ([token rangeOfCharacterFromSet:[NSCharacterSet alphanumericCharacterSet]].location == NSNotFound){ 
      return YES; 
     } else { 

      // We get here if the user Tabs away with an entry "pre-selected" 
      NSMutableArray *set = @[].mutableCopy; 
      for(NSObject *entry in tf.objectValue){ 

       GSContact *c; 
       if([entry isKindOfClass:GSContact.class]){ 
        c = (GSContact *)entry; 
       } 

       if([entry isKindOfClass:NSString.class]){ 

        NSString *number = [[(NSString *)entry stringByReplacingOccurrencesOfString:@">" withString:@""] 
             componentsSeparatedByString:@"<"][1]; 
        c = [self findContactByNumber:number]; 
       } 

       if(c) [set addObject:c]; 
      } 

      [control setObjectValue:set]; 
     } 
    } 
    return YES; 
} 

enter image description here

+0

¿Y premia la implementación específica de mi solución con los puntos para responder esta pregunta? Creo que eso podría estar en contra de las reglas de stackoverflow. – valexa

Cuestiones relacionadas