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
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).
Mire en el protocolo NSTableDataSource. El mensaje que está buscando se llama: tableView: setObjectValue: forTableColumn: row:
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
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?
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.
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.
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]
}
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
En realidad, no recibo esta notificación en absoluto en una vista de tabla basada en vista –
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
}
- 1. Cómo recibir una notificación cuando se notifica una notificación
- 2. ¿Puedo recibir una notificación cuando comience un nuevo día?
- 3. ¿Se puede recibir una notificación cuando un UITableView termine de desplazarse?
- 4. ¿Cómo recibir una notificación cuando un usuario cambia la contraseña o solicita un restablecimiento de contraseña?
- 5. ¿Cómo puedo decirle a QTableWidget que termine de editar una celda?
- 6. ¿Recibe una notificación cuando el usuario carga un cubo S3?
- 7. Cómo recibir una notificación cuando NSWindow se cierra
- 8. ¿Cómo puedo recibir una notificación cuando se crea una nueva ventana en Win32?
- 9. ¿Cómo recibir una notificación de luz LED?
- 10. ExtJS 4 - ¿Cómo editar condicionalmente una celda en una cuadrícula?
- 11. ¿Cómo puedo recibir una notificación cuando se completa una tarea dispatch_async?
- 12. Recibir una notificación cuando se selecciona la pestaña actual nuevamente
- 13. ¿Cómo publicar y recibir una notificación?
- 14. ¿Dónde y cómo registro un objeto para recibir una Notificación?
- 15. ¿Cómo recibir una notificación cuando el estado de SMS cambia de 'En cola' a 'Enviado'?
- 16. Cómo puedo recibir una notificación si una columna DataGrid está ordenada (y no ordenada)
- 17. Recibir notificación cuando se cambió el valor de RegistryKey
- 18. Editar una celda de tabla HTML
- 19. Animar una fila en un NSTableView
- 20. Colorear una fila en un NSTableView
- 21. ¿Cómo recibir notificaciones cuando una ventana se enfoca en WPF?
- 22. Objetivo C: recibir una notificación cuando se llame a un método
- 23. ¿Cómo mostrar el nombre de usuario actual en una celda?
- 24. Cómo recibir eventos cuando se conecta a la red y también cuando usuario inicia sesión en
- 25. ¿Hay alguna manera de recibir una notificación cuando cambie mi propiedad UIImageView.image?
- 26. ¿Cómo puedo poner un widget en una celda CellTable?
- 27. ¿Cómo puedo recibir notificaciones cuando se visualice UIView?
- 28. ¿Cómo puedo incluir un botón en una notificación de Toast?
- 29. ¿Cómo envío una notificación por correo electrónico cuando programo la creación de un usuario de Drupal?
- 30. ¿Cómo puedo recibir datos de una PC en un Arduino?
Parece que va a funcionar. Muchas gracias. :) – Andy