Pregunta

Estoy escribiendo una aplicación de uso de Datos Básicos para el control de un par de NSTableViews.Tengo un botón de añadir que hace un nuevo registro en la NSTableView.¿Cómo puedo hacer que el foco se moverá al nuevo registro al hacer clic en este botón para que de inmediato me puede escribir su nombre?Esta es la misma idea en iTunes, donde inmediatamente después de hacer clic en el agregar de la lista de reproducción botón el foco del teclado se trasladó a la nueva línea así que usted puede escribir del nombre de la lista.

¿Fue útil?

Solución

Bueno bueno, primero de todo, si usted no lo ha conseguido ya uno, usted necesita para crear una clase de controlador para su aplicación.Añadir una toma de corriente para la NSArrayController que los objetos se almacenan en, y una salida para la NSTableView que muestra los objetos, en la interfaz de la clase de controlador.

IBOutlet NSArrayController *arrayController;
IBOutlet NSTableView *tableView;

Conecte estas salidas a la NSArrayController y el NSTableView en IB.Entonces usted necesita para crear un IBAction método que se llama cuando el botón "Agregar" que se presiona;lo llaman addButtonPressed: o algo similar, declarando en su clase de controlador interfaz:

- (IBAction)addButtonPressed:(id)sender;

y también lo que es el destino de su botón "Añadir" en IB.

Ahora lo que necesita para implementar esta acción en el controlador de implementación de la clase;este código supone que los objetos que se han agregado a su controlador de matriz son NSStrings;si no lo están, a continuación, reemplace el tipo de la new variable a cualquier tipo de objeto que desee agregar.

//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];
}

Este será llamado cuando usted haga clic en el botón "Agregar", y la celda de la primera columna de la fila nueva comenzará a ser editado.

Otros consejos

Creo que una forma más fácil y 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. recuperar el índice de fila seleccionado
  3. Llame editColumn:(NSInteger)column row:(NSInteger)row withEvent:(NSEvent *)theEvent select:(BOOL)select 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.

Simplemente cree un @IBAction separado en su controlador e invoque el método NSArrayController.add manualmente. Después de eso, puede seleccionar la fila

@IBAction func addLink(_ sender: Any) {
    // Get the current row count from your data source
    let row = links.count

    arrayController.add(sender)

    DispatchQueue.main.async {
        self.tableView.editColumn(0, row: row, with: nil, select: true)
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top