Pregunta

Tengo una subclase personalizada NSTableView lleno de varias subclases NSTextFieldCell personalizado. Me gustaría ser capaz de cambiar la celda editada mediante el uso de las teclas de flecha.

Soy capaz de lograr esto mediante la creación de un editor de campo personalizado (subclasificando NSTextView) y devolviéndolo del delegado ventana de este modo:

- (id) windowWillReturnFieldEditor:(NSWindow *) aWindow toObject:(id) anObject {
    if ([anObject isEqual:myCustomTable]) {
        if (!myCustomFieldEditor) {
            myCustomFieldEditor = [[MyNSTextViewSubclass alloc] init];
            [myCustomFieldEditor setTable:anObject];
        }
        return myCustomFieldEditor;
    }
    else {
        return nil;
    }
}

En MyNSTextViewSubclass, puedo reemplazar los moveUp:, moveDown:, moveLeft:, y los métodos para poner en práctica mi moveRight: funcionalidad deseada, y que todo funciona bien. El único problema es que el editor de campo se comporta ya no es como un editor de celdas campo de texto. Por ejemplo, cuando pulso la tecla Intro, se inserta una nueva línea en el campo de texto en vez de terminar la edición.

¿Cómo puedo crear un editor de campo personalizado que responde exactamente igual que el defecto no hace para una NSTextFieldCell (a excepción de aquellas cuatro funciones que harán caso omiso)? O hay una mejor manera de cambiar la funcionalidad ofmoveUp:, moveDown:, moveLeft: y moveRight:?

EDIT: Parece ser que el editor de campo establece el campo de texto como su delegado cuando se selecciona para la edición. En ese caso, podría ser útil para apenas la fijación con el método control:textView:doCommandBySelector: delegado como se describe aquí , pero cuando implemente esa función, ya sea en mi subclase NSTextFieldCell o mi subclase NSTableView, nunca se llama a. ¿Por qué no?

¿Fue útil?

Solución

Me pasaba casi todo el día en este problema, pero finalmente lo he descubierto. Con el fin de ser capaz de atravesar mi subclase NSTableView con las teclas de flecha, he tenido que añadir el siguiente método para mi NSTableView:

- (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector {
    if(aSelector == @selector(moveUp:)) {
        [self moveSelectionToPreviousRow];
        return YES;
    } else if(aSelector == @selector(moveDown:)) {
        [self moveSelectionToNextRow];
        return YES;
    } else if(aSelector == @selector(moveLeft:)) {
        [self moveSelectionToPreviousColumn];
        return YES;
    } else if(aSelector == @selector(moveRight:)) {
        [self moveSelectionToNextColumn];
        return YES;
    }
    return NO;
}

Esto se debe a que el editor de campo por defecto es una NSTextView (no es una NSControl), así que necesitaba para utilizar el protocolo <NSTextViewDelegate>. La vista que se establece como su delegado es el NSTableView, no el NSTextFieldCell. Las funciones moveSelectionTo... se definen las funciones personalizadas en mi NSTableView subclase que no perder de vista la celda actualmente editado y luego se mueven a su alrededor en consecuencia.

Otros consejos

entrada

posiblemente relacionados en la documentación de Apple:

setFieldEditor:

Controla si las vistas de texto que comparten controlador de distribución se comportan del receptor como editores de campo.

- (void)setFieldEditor:(BOOL)flag

Parámetros

bandera . YES para hacer que las vistas de texto que comparten gestor de diseño del receptor se comporten como editores de campo, de lo contrario NO

discusión

editores de campo interpretan Tab, Shift-Tab y Retorno (Enter) como señales para finalizar la edición y posiblemente cambiar el primer nivel de respuesta. editores no aceptan campo en lugar estos personajes como la introducción de texto. Consulte “campos de texto, las vistas de texto, y el editor de campo” para más información sobre editores de campo. Por defecto, las vistas de texto no se comportan como editores de campo.

La forma más fácil de lograr lo que necesita es implementar control:textView:doCommandBySelector: en el delegado de la vista de tabla.

Véase también mi respuesta a una pregunta similar aquí: con NSTableView

La respuesta al título más general de esta pregunta se puede encontrar en esta respuesta: https://stackoverflow.com/a/ 8865953/43615

Básicamente, uno subclases NSTextFieldCell y anulaciones fieldEditorForView:, donde uno simplemente crea una subclase personalizada de NSTextView y se define la propiedad fieldEditor a YES.

Estos tienen que ser cambiados método keyDown:(NSEvent *)event de su objeto NSTextFieldCell subclases. Se comprueba la tecla pulsada (una de las flechas) y de otra manera de llamar a super.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top