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.

Foi útil?

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 NSStrings; 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

  1. Implemento tableViewSelectionDidChange:(NSNotification *)notification
  2. buscar o índice de linha selecionado
  3. 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)
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top