Pregunta

Tengo la siguiente situación:

  1. Hay una vista personalizada dentro de la primera ventana que contiene NSTableView.
  2. Hay una segunda ventana que actúa como un formulario para el objeto actual detrás de la selección de la vista de tabla dentro de la primera ventana.

Algunos detalles más:

  • He implementado setDoubleAction:comportamiento en NSTableView que básicamente abre la segunda ventana
  • La vista de tabla está vinculada a los objetos organizados de un NSArrayController (subclasificado)
  • Los elementos de la interfaz específicos en la segunda ventana (que se abre al hacer doble clic) están vinculados a la selección de NSArrayController
  • Subclasé NSArrayController y modifiqué las siguientes funciones:

Al principio cambié addObject:(o agregue:, esto realmente no importa):

- (void)addObject:(id)object
{
    [super addObject:object];
    [self saveTemplatesToDisk];
}

Luego cambié eliminar:

- (void)remove:(id)sender
{
    [super remove:sender];
    [self saveTemplatesToDisk];
}
  • La acción que abre la hoja de preferencias es solo una línea: [NSApp beginSheet:preferenceWindow modalForWindow:[_preferenceView window] modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
  • El código que se ejecuta después de que el usuario presiona la tecla de retorno/botón Aceptar tampoco es complicado.

Simplemente guarda el contenido actual del controlador de matriz en el disco y cierra la segunda ventana:

- (IBAction)endPreferenceSheet:(id)sender
{
    [templateArrayController saveTemplatesToDisk];

    [NSApp endSheet:preferenceWindow];
    [preferenceWindow orderOut:nil];
}

Finalmente aquí está mi problema/pregunta.

Cuando presiono la tecla de retorno en la segunda ventana, la ventana se cierra, los datos se guardan y NSTableView se recarga correctamente sin ninguna interacción adicional.Pero cuando presiono el botón Aceptar con el mouse, parece que no sucede nada.Aquí está la parte interesante:cuando ahora selecciono otra fila en la vista de tabla en la primera ventana después de que desapareció la segunda ventana, la fila previamente seleccionada (léase:el objeto actualizado) se recarga correctamente y muestra el contenido que he editado en la segunda ventana que tiene elementos de interfaz vinculados a la selección.

Básicamente, mi implementación funciona, pero no cuando el usuario usa el mouse para cerrar la ventana.

La única diferencia que puedo detectar es el evento actual, pero no puedo imaginar cómo esto podría cambiar el comportamiento de esta sencilla aplicación.

  • Cuando presiono el botón OK con el mouse: NSEvent: type=LMouseUp loc=(563.055,30.1484) time=58450.2 flags=0 win=0x0 winNum=5371 ctxt=0x0 evNum=8093 click=1 buttonNumber=0 pressure=0 subtype=NSTabletPointEventSubtype deviceID=0 x=19469 y=15838 z=0 buttons=0x0 pressure=0.000000 tilt={0.453108, -0.140629} rotation=0.000000 tangentialPressure=0.000000 vendor1-3=(0, 0, 0)
  • Cuando presiono regresar: NSEvent: type=KeyDown loc=(0,300) time=58474.8 flags=0 win=0x0 winNum=5371 ctxt=0x0 chars=" " unmodchars=" " repeat=0 keyCode=36

¿Alguna idea de cómo puedo resolver mi problema?

¿Fue útil?

Solución

Recuerde que la cadena de respuesta: Los eventos de teclado se inicia en el primer nivel de respuesta, que será el editor de campo, entonces (si es que no maneja ella) va a la siguiente respuesta, que será la vista de tabla. El evento de ratón va directamente a la opinión de que el usuario ha hecho clic en, que es el botón.

Por lo tanto, la diferencia es que la vista de tabla controla el evento de retorno, pero nunca ve el evento de ratón. Cuando el usuario hace clic, sólo tiene que reciben un mensaje de acción de los restos de botón en la vista de tabla en el modo de edición.

La solución es tener el método de acción dice que el controlador commit edición antes de continuar con la acción real.

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