web-dev-qa-db-fra.com

Double-click sur une ligne NableView dans Cocoa?

J'ai besoin que mon application ouvre une fenêtre lorsqu'un utilisateur double-clique sur une ligne dans une NSTableView. J'ai un peu de difficulté à trouver des informations ou des exemples sur la façon de procéder. Quelqu'un peut-il me diriger dans la bonne direction?

65
Allyn

Regardez la méthode -setDoubleAction: sur NSTableView; vous pouvez définir cela sur une méthode appelée, tout comme le système normal action-cible, mais par double-clic.

Dans cette méthode d'action, -clickedRow sera utile.

123
Jim Puls

Ajouter plus d’informations de base à @JimPuls answer au profit d’autres nouveaux arrivants dans Cocoa.

  1. Un IBOutlet à NSTableView doit être déclaré dans une interface. J'ai supposé qu'il était préférable de le faire dans le délégué de la table.
  2. L'IBOutlet de la table doit être connecté via Interface Builder. Pour ce faire, Ctrl-Drag & Drop dans IB à partir de la classe qui déclare la sortie à la vue tabulaire. Lorsque vous relâchez votre souris, une fenêtre contextuelle devrait apparaître avec le nom du point de vente que vous avez déclaré à l’étape 1. Sélectionnez ça.
  3. Dans la section @implementation, sur la méthode -awakeFromNib, appelez -setTarget: et -setDoubleAction: sur l'IBOutlet déclaré à l'étape 1 et connecté à l'étape 2.

Voici un extrait de mon délégué de la vue de table. Mon délégué est également configuré en tant que source de données, c'est pourquoi vous verrez les interfaces NSTableViewDelegate et NSTabeViewDataSource associées.

// extrait d'interface.

@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

// Extrait d'implémentation.

@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...
}

J'espère que cela t'aides.

54
amateur barista

Comme PR Singh l'a dit, vous pouvez utiliser des liaisons de cacao, vous pouvez également transmettre les selectedObjects.

  1. Sélectionnez votre vue Table dans IB puis dans l'inspecteur des liaisons définissez ces deux liaisons comme suit:

    >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:
    

Où myMethod est implémenté en tant que

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

Ceci est également documenté ici: https://developer.Apple.com/library/mac/qa/qa1472/_index.html

10
GeoffCoope

Si quelqu'un recherche une version 2.0 de Swift: C'est ce qui fonctionne pour moi. Cela semble beaucoup plus facile que le code Objective C. 

@IBOutlet weak var searchResultTable: NSTableView!

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

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

Vous pouvez câbler l'action de double-clic dans Interface Builder. Tout en maintenant la touche Tableau enfoncée, cliquez sur la vue Table (assurez-vous que vous obtenez la vue table et non la vue Défilement, la vue Clip ou une colonne de table) pour afficher son panneau de connexions. Recherchez l'élément “doubleAction” dans la section “Actions envoyées”. Connectez-le à l'IBAction de votre choix.

6
rob mayoff

Sur Swift 4.1Vous définissez la méthode doubleAction de l'objet TableView dans votre code pour exécuter une fonction @objc à l'aide d'un #selector (nameOfYourFunction).

Dans cette fonction, vous appelez un segment . Vous pouvez lier votre nouvelle fenêtre à la fenêtre Origine sur InterfaceBuilder (pas à l'objet NSTableView, mais à l'objet ViewController proprement dit.

Ensuite, faites tous vos réglages pour la nouvelle fenêtre sur Prepar for Segue:

D'abord sur Interface Builder:

 enter image description here

Bien sûr, donnez un identifiant à cette séquence:

 enter image description here

Ensuite, dans notre premier contrôleur de vue (où se trouve la vue table), code:

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

Ensuite, nous avons besoin d’une fonction pour effectuer la transition sur le double-clic de la vue tableau. Cette fonction est appelée avec un sélecteur # et doit donc être visible pour l’objectif C (même si nous programmons dans Swift). Objc c'est tout.

@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)
 }
}

Enfin, nous définissons cette fonction avec la méthode doubleAction de TableView dans la partie de configuration initiale de notre code, comme suit:

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

Vous pouvez faire la même chose avec les liaisons, tout d’abord déclarer un mentod dans un fichier .h

-(IBAction)openWindow:(id)sender

dans le fichier .m mettre en œuvre le même

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

arrivé à cette référence où la vue table est présente, sélectionnez la vue table et avez obtenu l'avant-dernier onglet de l'inspecteur d'attributs, ouvrez le triangle de divulgation d'argument double cicl vérifier la liaison avec le propriétaire du fichier de sélection fox, la clé de modèle doit être "self", sélecteur nom sera "openWindow:", le même processus fait avec la divulgation "Double click target", Cela fonctionnera

0
PR Singh