2008-10-11 13 views
5

Necesito saber cuando el usuario termina de editar una celda en un NSTableView. La tabla contiene todos los calendarios del usuario (obtenidos de CalCalendarStore), por lo que para guardar los cambios del usuario, debo informar a CalCalendarStore de los cambios. Sin embargo, no puedo encontrar nada que se llame después de que el usuario finalice su edición: supongo que habría un método en el delegado de la tabla, pero solo vi uno que se llama cuando se inicia la edición, no cuando finaliza la edición.¿Cómo puedo recibir una notificación cuando el usuario termine de editar una celda en un NSTableView?

Respuesta

2

Subclase NSTableView e invalida textDidEndEditing: (asegúrese de llamar a la implementación de super).

Esto solo será invocado por los campos de texto NSTextFieldCell o NSComboBoxCell (pero solo al cambiar el valor tipeándolo, no seleccionando el valor del menú del combo).

+0

Parece que va a funcionar. Muchas gracias. :) – Andy

1

Mire en el protocolo NSTableDataSource. El mensaje que está buscando se llama: tableView: setObjectValue: forTableColumn: row:

+1

Esta es probablemente la respuesta correcta. Dicho esto, funciona solo con una tabla basada en celdas. Si está usando una tabla basada en vista, ese método nunca se llama. – dgatwood

1

Eso no parece funcionar en mi caso. Establecí mi clase de controlador como DataSource en la tabla, pero nunca se llamó al método. La información es que mi tabla está vinculada a los valores en un NSArrayController. ¿Podría ser por eso que no se invocó mi objeto?

2

Establecer observadores para cada elemento de la matriz de contenido utilizando addObserver: toObjectsAtIndexes: forKeyPath: Opciones: contexto:

También tendrá que establecer un observador de la propia matriz, por lo que se le notificará acerca de los objetos que se agregan o quitan de la matriz.

Para ver un ejemplo del proyecto iSpend.

-1

Subclase NSArrayController y reemplaza objectDidEndEditing: (asegúrate de llamar a la implementación de super).

Esto generalmente solo será invocado por los campos de texto NSTextFieldCell o NSComboBoxCell (pero solo cuando se cambie el valor tipeándolo, no seleccionando el valor del menú del combo). Puede haber algunas otras celdas que lo invocarán, pero no estoy seguro de cuáles. Si tiene una celda personalizada, entonces considere implementar los protocolos informales NSEditor y NSEditorRegistration.

14

Puede obtener el mismo resultado sin crear subclases NSTableView utilizando NSNotificationCenter o utilizando los métodos NSControl. Consulte la documentación de Apple aquí:

http://developer.apple.com/library/mac/#qa/qa1551/_index.html

Es sólo un par de líneas de código y funcionaba perfectamente para mí.


Si puede ser el delegate del NSTableView sólo tiene que poner en práctica el método

- (void)controlTextDidEndEditing:(NSNotification *)obj { ... } 

De hecho, NSTableView es el delegate de los NSControl elementos que contiene, y reenvía los método llama a es delegate (Hay otros métodos que son útiles)

De lo contrario, utilice el NSNotificationCenter:

// where you instantiate the table view 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidEnd:) 
    name:NSControlTextDidEndEditingNotification object:nil]; 

// somewhere else in the .m file 
- (void)editingDidEnd:(NSNotification *)notification { ... } 

// remove the observer in the dealloc 
- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
    name:NSControlTextDidEndEditingNotification object:nil]; 
    [super dealloc] 
} 
+1

Bueno, esto es correcto o incorrecto, dependiendo de si está usando tablas basadas en celdas o basadas en vista. Si está utilizando tablas basadas en celdas y su objetivo es escribir los cambios, este enfoque no funcionará porque esta notificación se envía * antes * al método tableView: setObjectValue: forTableColumn: row: se llama para almacenar los valores en la fuente de datos, por lo que estará escribiendo los valores anteriores. – dgatwood

+0

En realidad, no recibo esta notificación en absoluto en una vista de tabla basada en vista –

0

Traduciendo @ respuesta de Milly en Swift 3:

// Setup editing completion notifications 
NotificationCenter.default.addObserver(self, selector: #selector(editingDidEnd(_:)), name: NSNotification.Name.NSControlTextDidEndEditing, object: nil) 

función para gestionar la notificación:

func editingDidEnd(_ obj: Notification) { 
    guard let newName = (obj.object as? NSTextField)?.stringValue else { 
     return 
    } 

    // post editing logic goes here 
} 
Cuestiones relacionadas