Pergunta

Eu preciso do meu aplicativo para abrir uma janela quando um usuário clica duas vezes em uma fileira em um NSTableView. Estou tendo um pouco de informação constatação momento difícil ou exemplos sobre como fazer isso. Alguém pode me apontar na direção certa?

Foi útil?

Solução

Dê uma olhada no -setDoubleAction: método em NSTableView; você pode definir que para um método que será chamado apenas como o sistema de ação alvo normal, mas em um clique duplo.

Nesse método de ação, -clickedRow será útil.

Outras dicas

Como adicionar informações mais básico para resposta @JimPuls para o benefício de outros recém-chegados para Cacau.

  1. Uma IBOutlet ao NSTableView precisa ser declarado em uma interface. I presume-se preferido fazê-lo em delegado da tabela.
  2. O IBOutlet a tabela precisa ser conectado via Interface Builder. Para fazer isso Ctrl-Drag & Drop in IB da classe que declara a saída para a exibição de tabela. Quando você soltar o mouse um pop-up deve aparecer com o nome do outlet que declarou no passo # 1. Selecione isso.
  3. Na seção @implementation, no método -awakeFromNib, chamar -setTarget: e -setDoubleAction:. Na IBOutlet declarou no passo # 1 e ligado no passo # 2

Aqui está um trecho do meu ponto de vista mesa delegado. Tenho meu delegado também configurado como a fonte de dados, é por isso que você vai ver os dois interfaces NSTableViewDelegate e NSTabeViewDataSource associados.

// interface trecho.

@interface MyTableViewDelegate : NSObject <NSTableViewDelegate, NSTableViewDataSource>
{
  // This iVar needs to be connected to the table view via the IB.
  IBOutlet NSTableView *tableOutlet;
}

@property (assign) IBOutlet NSTableView *tableOutlet;

- (void)doubleClick:(id)nid;

@end

// trecho de Implementação.

@implementation MyTableViewDelegate

@synthesize tableOutlet = _tableOutlet;

- (void)awakeFromNib {
  [_tableOutlet setTarget:self];
  [_tableOutlet setDoubleAction:@selector(doubleClick:)];
}

- (void)doubleClick:(id)object {
  // This gets called after following steps 1-3.
  NSInteger rowNumber = [_tableOutlet clickedRow];
  // Do something...
}

Espero que isso ajude.

Como PR Singh disse, você pode usar ligações de cacau, você também pode passar ao longo das selectedObjects.

  1. Selecione o seu Ver Tabela no IB, em seguida, em Ligações inspector, estas duas ligações da seguinte forma:

    >Double Click Target
    
    bind to = Application delegate object (or file owner)
    model key path = self
    selector name = myMethod:
    
    >Double Click Argument
    
    bind to = array controller
    controller key = selectedObjects
    selector name = myMethod:
    

Onde myMethod é implementado como

- (void)myMethod:(NSArray*)selectedObjects
{
    NSLog(@"%@", selectedObjects);
}

Isso também está documentado aqui: https://developer.apple.com/library/mac/qa/ qa1472 / _index.html

Se alguém olha para uma versão rápida 2.0: Isto é o que funciona para mim. Parece muito mais fácil do que o código Objective C.

@IBOutlet weak var searchResultTable: NSTableView!

override func viewDidLoad() {
    super.viewDidLoad()
    searchResultTable.doubleAction = "doubleClickOnResultRow"
}

func doubleClickOnResultRow()
{
    print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}

Você pode conectar-se a ação de duplo clique no Interface Builder. Control-clique sua exibição de tabela (certifique-se que você está recebendo a visualização tabela , e não o ponto de vista de rolagem ou o ponto de vista clipe ou uma coluna de tabela) para obter seu painel de conexões. Encontre o item “DoubleAction” na seção “Ações enviados”. Conecte-o ao IBAction de sua escolha.

Em SWIFT 4.1 Você definir o método DoubleAction do objeto TableView dentro de seu código para executar uma função @objc usando um #selector (nameOfYourFunction)

Dentro dessa função, você chama um segue. Você pode vincular sua nova janela para a janela de origem em InterfaceBuilder (não ao objeto NSTableView mas o objeto ViewController real.

Em seguida, faça toda a sua configuração para a nova janela em se preparar para segue:

Tudo bem pela primeira vez no Interface Builder:

enter descrição da imagem aqui

Claro que dar um identificador para que segue:

enter descrição da imagem aqui

código

A seguir, dentro do nosso primeiro controlador de vista (onde a vista de tabela é):

 //We use this function: prepare for segue
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
        // check if we are referring to the actual segue we want
          if segue.identifier?.rawValue == "segueToYourNewWindow" {
    // now create a reference to that new window
            let yourNewWindow = segue.destinationController as! newWindowViewController
    // now change variables inside that view controller code, remember that the objects might fail if they are not yet visible to the user so first set up the variables or call them using the main thread, up to your design.
           yourNewWindow.selectedRowVariable = thisTableView.clickedRow
        }

Em seguida, precisamos de uma função para executar a segue em duplo clique da vista de tabela, esta função é chamada com um #selector e, portanto, precisa ser visível para Objective C (mesmo que estamos programando em Swift) nós simplesmente iniciar o função com @Objc é isso.

@objc func doubleClickOnResultRow() {
//beware of double-clicking also triggers this function when no rows is selected with the selectedRow being -1
 if (thisTableView.selectedRow > -1 ) {
  performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "segueToYourNewWindow"), sender: nil)
 }
}

Finalmente, defina esta função para o método DoubleAction do TableView na parte configuração inicial do nosso código como este:

override func viewDidLoad() {
    super.viewDidLoad()
    thisTableView.doubleAction = #selector(doubleClickOnResultRow)
}

Você pode fazer mesma coisa com as ligações, em primeiro lugar declarar um mentod em .h arquivo

-(IBAction)openWindow:(id)sender

no arquivo .m implementar o mesmo

-(IBAction)openWindow:(id)sender
{
    //do something here;
}

conseguiu que nib onde sua exibição de tabela está presente, selecione exibição de tabela e tem a segunda última guia de inspetor de atributo, o argumento CICLs verificação divulgação duplo triângulo aberto ligam para verificar o proprietário do arquivo selecione raposa, modelo chave pat deve ser "auto ", nome seletor será 'openWindow:' mesmo processo ver com 'divulgação alvo Clique duas vezes', Isto irá funcionar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top