Estoy escribiendo una aplicación que utiliza Core Data para controlar algunas NSTableViews. Tengo un botón para agregar que hace un nuevo registro en NSTableView. ¿Cómo hago que el foco se mueva al nuevo registro cuando se hace clic en este botón para que pueda escribir inmediatamente su nombre? Esta es la misma idea en iTunes, donde inmediatamente después de hacer clic en el botón Agregar lista de reproducción, el foco del teclado se mueve a la nueva línea para que pueda escribir el nombre de la lista de reproducción.Mover el foco al registro recién agregado en un NSTableView
Respuesta
Bien, antes que nada, si aún no tiene una, necesita crear una clase de controlador para su aplicación. Agregue una toma de corriente para el NSArrayController
en el que están almacenados sus objetos, y una toma de corriente para el NSTableView
que muestra sus objetos, en la interfaz de su clase de controlador.
IBOutlet NSArrayController *arrayController;
IBOutlet NSTableView *tableView;
conectar estas salidas a la NSArrayController
y la NSTableView
en IB. Luego debe crear un método IBAction
al que se llama cuando se presiona el botón "Agregar"; llamarlo addButtonPressed:
o algo similar, declarando que en su interfaz de clase controlador:
- (IBAction)addButtonPressed:(id)sender;
y también lo que es el objetivo de su botón "Añadir" en el IB.
Ahora necesita implementar esta acción en la implementación de su clase de controlador; este código asume que los objetos que ha agregado a su controlador de array son NSString
s; si no lo están, reemplace el tipo de la variable new
por el tipo de objeto que esté agregando.
//Code is an adaptation of an excerpt from "Cocoa Programming for
//Mac OS X" by Aaron Hillegass
- (IBAction)addButtonPressed:(id)sender
{
//Try to end any editing that is taking place in the table view
NSWindow *w = [tableView window];
BOOL endEdit = [w makeFirstResponder:w];
if(!endEdit)
return;
//Create a new object to add to your NSTableView; replace NSString with
//whatever type the objects in your array controller are
NSString *new = [arrayController newObject];
//Add the object to your array controller
[arrayController addObject:new];
[new release];
//Rearrange the objects if there is a sort on any of the columns
[arrayController rearrangeObjects];
//Retrieve an array of the objects in your array controller and calculate
//which row your new object is in
NSArray *array = [arrayController arrangedObjects];
NSUInteger row = [array indexOfObjectIdenticalTo:new];
//Begin editing of the cell containing the new object
[tableView editColumn:0 row:row withEvent:nil select:YES];
}
Esto entonces se llamará cuando se hace clic en el botón "Añadir", y la celda de la primera columna de la fila nueva comenzará a ser editado.
NSArrayController tiene IBAction "agregar". Puede vincular un botón a esta acción. ¿Se puede llamar directamente? (Lo probé, no funciona) Si pudiera, tendría que crear un objeto nuevo como este, pero simplemente llame a agregar, ¿verdad? – Vojto
Creo que una forma más fácil y más adecuada de hacerlo es implementarlo de esta manera.
-(void)tableViewSelectionDidChange:(NSNotification *)notification {
NSLog(@"%s",__PRETTY_FUNCTION__);
NSTableView *tableView = [notification object];
NSInteger selectedRowIndex = [tableView selectedRow];
NSLog(@"%ld selected row", selectedRowIndex);
[tableView editColumn:0 row:selectedRowIndex withEvent:nil select:YES];
I.e.
- Implementar
tableViewSelectionDidChange:(NSNotification *)notification
- buscar el índice de la fila seleccionada
editColumn:(NSInteger)column row:(NSInteger)row withEvent:(NSEvent *)theEvent select:(BOOL)select
llamada desde allí con el índice de la fila.
Nota importante: esta solución también activará la edición cuando el usuario simplemente seleccione una fila. Si solo desea que se active la edición al agregar un nuevo objeto, esto no es para usted.
- 1. Agregue el evento onclick al elemento recién agregado en JavaScript
- 2. Mover el foco a un campo particular
- 3. crystal report field explorer no muestra el campo recién agregado
- 4. Vinculación automática de ASP.NET FormView al registro recién insertado
- 5. git-gui: mover el foco del teclado a "archivos modificados"
- 6. Cuadrícula de datos Establecer foco en la fila recién agregada
- 7. WPF DataGrid - Cómo mover el foco del teclado a la fila recién agregada después de la pestaña presione
- 8. Obteniendo la ID del registro recién insertado?
- 9. Validación ignorado cuando se clona un registro recién creado
- 10. entrada en el foco o la tecla de tabulación presionada, mover al centro de la pantalla
- 11. ASP.NET MVC Obtener ID del último registro agregado
- 12. Ocultando el teclado al perder el foco en un UITextView
- 13. Mover el foco de JTextArea mediante la ficha clave
- 14. La ventana modal recién creada pierde el foco y se vuelve inaccesible en Windows Vista
- 15. No se puede editar el campo de elemento de trabajo recién agregado
- 16. Mover el foco a la siguiente celda al presionar la tecla Entrar ¿WPF DataGrid?
- 17. Eclipse: cómo actualizar un archivo de prueba JUnit con el método recién agregado en el archivo fuente?
- 18. Cómo mover la ventana de la ventana de texto al obtener el foco?
- 19. ¿Cómo insertar un registro y devolver el ID recién creado con un solo SqlCommand?
- 20. Cambiar el foco al siguiente componente en JTable usando TAB
- 21. Animar filas en un NSTableView
- 22. Cómo permitir al usuario mover un control en el formulario
- 23. Mover la ventana de registro de GWT
- 24. Ocultando el encabezado NSTableView?
- 25. Mover un foco cuando el campo de texto de entrada alcanza una longitud máxima
- 26. Mover el foco de un cuadro de texto Editar a otro
- 27. El foco salta aleatoriamente al desplazarse
- 28. CEdit selecciona todo al obtener el foco
- 29. ¿Puedo mover la ventana de otro programa al frente del foco?
- 30. cómo establecer el foco en un div usando javascript o jquery cuando # ya está agregado en url?
¿Cómo se almacenan sus datos? En un controlador de matriz? –
Sí, está en un NSArrayController. – hekevintran