2009-05-10 16 views
13

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

+0

¿Cómo se almacenan sus datos? En un controlador de matriz? –

+0

Sí, está en un NSArrayController. – hekevintran

Respuesta

18

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.

+0

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

1

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.

  1. Implementar tableViewSelectionDidChange:(NSNotification *)notification
  2. buscar el índice de la fila seleccionada
  3. 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.

Cuestiones relacionadas