Mover el foco a los recién agregado grabar en un NSTableView
-
20-08-2019 - |
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.
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 NSString
s;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.
- Implementar
tableViewSelectionDidChange:(NSNotification *)notification
- recuperar el índice de fila seleccionado
- 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)
}
}