Mova o foco para o recorde recém -adicionado em um NSTABLEVIEW
-
20-08-2019 - |
Pergunta
Estou escrevendo um aplicativo usando dados principais para controlar algumas visualizações nstable. Eu tenho um botão Adicionar que torna um novo registro no NSTableView. Como faço para fazer o foco passar para o novo registro quando esse botão é clicado para que eu possa digitar imediatamente seu nome? Essa é a mesma idéia no iTunes, onde imediatamente depois de clicar no botão Adicionar lista de reprodução, o foco do teclado é movido para a nova linha para que você possa digitar o nome da lista de reprodução.
Solução
Ok, bem, antes de tudo, se você ainda não tem um, precisa criar uma classe de controlador para o seu aplicativo. Adicione uma tomada para o NSArrayController
que seus objetos são armazenados e uma saída para o NSTableView
Isso exibe seus objetos, na interface da sua classe de controlador.
IBOutlet NSArrayController *arrayController;
IBOutlet NSTableView *tableView;
Conecte essas saídas ao NSArrayController
e a NSTableView
em ib. Então você precisa criar um IBAction
método que é chamado quando o botão "Adicionar" é pressionado; chame-o addButtonPressed:
Ou algo semelhante, declarando -o na interface da sua classe de controlador:
- (IBAction)addButtonPressed:(id)sender;
e também tornando -o o alvo do seu botão "Adicionar" no IB.
Agora você precisa implementar essa ação na implementação do seu controlador; Este código pressupõe que os objetos que você adicionou ao seu controlador de matriz são NSString
s; Se não forem, substitua o tipo de new
variável para qualquer tipo de objeto que você esteja adicionando.
//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];
}
Isso será chamado quando você clicar no botão "Adicionar" e a célula na primeira coluna da nova linha começará a ser editada.
Outras dicas
Acredito que uma maneira mais fácil e mais adequada de fazer isso é implementá -lo dessa maneira.
-(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];
Ou seja
- Implemento
tableViewSelectionDidChange:(NSNotification *)notification
- buscar o índice de linha selecionado
- Ligar
editColumn:(NSInteger)column row:(NSInteger)row withEvent:(NSEvent *)theEvent select:(BOOL)select
De lá com o índice da linha.
NOTA IMPORTANTE: Esta solução também acionará a edição quando o usuário simplesmente selecionar uma linha. Se você deseja que a edição seja acionada ao adicionar um novo objeto, isso não é para você.
Basta criar um separado @IBAction
em seu controlador e invocar o NSArrayController.add
método manualmente. Depois disso, você pode selecionar a linha
@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)
}
}