2011-03-02 14 views
7

Esta pregunta parece simple, pero he intentado todo lo que puedo pensar, y busqué en Google durante horas.¿Cómo hacer que NSSearchField envíe acción después de la autocompletación?

Tengo un NSSearchField que se autocompleta, básicamente copiando el SearchField sample code de Apple. He desactivado "Sends Whole Search String" en IB porque no quiero hacer la búsqueda hasta que el usuario haya finalizado su entrada de texto y no quiera hacer varias búsquedas (son caras).

A medida que el usuario escribe en el campo, cuando presionen enter, especificando que aceptan la autocompletación actual, quiero que se active la acción de NSSearchField. En cambio, simplemente parece completar el autocompletado, luego el usuario tiene que presionar enter por segunda vez para que la acción se dispare. Básicamente, piense en comenzar a escribir una URL en Safari, se autocompleta y al presionar enter comienza a cargar la página (disparando la acción). No necesitan presionar enter por segunda vez para comenzar a cargar la página.

cosas que he intentado sin éxito:

  • de control: Vista de Texto: commandSelector :, buscando insertNewline :. No se activa cuando presionan enter para finalizar el autocompletado.
  • Overriding controlTextDidEndEditing :. Igual que el anterior

¿Alguna idea? ¡Gracias!

Respuesta

5

Descubrí cómo hacer que esto funcione.

Debe sobrescribir NSFieldEditor para NSTextViews.

Para proporcionar una versión sustituida, en el delegado del NSWindow:

- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client 
{ 
    if ([client isKindOfClass:[NSSearchField class]]) 
    { 
     if (!_mlFieldEditor) 
     { 
      _mlFieldEditor = [[MLFieldEditor alloc] init]; 
      [_mlFieldEditor setFieldEditor:YES]; 
     } 
     return _mlFieldEditor; 
    } 
    return nil; 
} 

_mlFieldEditor es una variable de instancia. Aquí está la definición:

@interface MLFieldEditor : NSTextView 
@end 

@implementation MLFieldEditor 


- (void)insertCompletion:(NSString *)word forPartialWordRange:(NSRange)charRange movement:(NSInteger)movement isFinal:(BOOL)flag 
{ 
    // suppress completion if user types a space 
    if (movement == NSRightTextMovement) return; 

    // show full replacements 
    if (charRange.location != 0) { 
     charRange.length += charRange.location; 
     charRange.location = 0; 
    } 

    [super insertCompletion:word forPartialWordRange:charRange movement:movement isFinal:flag]; 

    if (movement == NSReturnTextMovement) 
    { 
     [[NSNotificationCenter defaultCenter] postNotificationName:MLSearchFieldAutocompleted object:self userInfo:nil]; 
    } 
} 

@end 

La parte clave es la NSReturnTextMovement después de la [insertCompletion súper ...].

La primera parte va a cambiar para que teclear la tecla de espacio no se llevará a cabo la terminación automática, que era un comentario que había hecho en: How to prevent NSSearchField from overwriting entered strings using the first autocompletion list entry?

Cuestiones relacionadas