Question

J'ai besoin que mon application ouvre une fenêtre lorsqu'un utilisateur double-clique sur une ligne dans un 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?

Était-ce utile?

La solution

Jetez un coup d'œil au -setDoubleAction: sur NSTableView; vous pouvez définir cela sur une méthode qui sera appelée comme le système normal d’action cible mais sur un double-clic.

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

Autres conseils

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

  1. Un IBOutlet vers 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 & amp; Déposer dans IB de la classe qui déclare le point de vente dans la vue table. Lorsque vous relâchez votre souris, une fenêtre contextuelle contenant le nom du point de vente déclaré à l’étape 1 doit apparaître. Sélectionnez cela.
  3. Dans la section @implementation, dans 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 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 vous aidera.

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

  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

Si quelqu'un recherche une version 2.0 rapide: 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)")
}

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

Sous SWIFT 4.1 Vous 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 une division. Vous pouvez lier votre nouvelle fenêtre à la fenêtre d'origine sur InterfaceBuilder (pas à l'objet NSTableView, mais à l'objet ViewController réel.

Ensuite, effectuez tous les réglages pour la nouvelle fenêtre préparant la transition:

D'abord sur Interface Builder:

 entrer la description de l'image ici

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

 entrer la description de l'image ici

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), nous démarrons simplement le fonctionner avec @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 avons défini cette fonction sur la méthode doubleAction de TableView dans la partie configuration initiale de notre code, comme suit:

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

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 implémente le même

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

vous êtes arrivé au point où votre vue table est présente, sélectionnez-la et avez obtenu le dernier onglet de l'inspecteur d'attributs, ouvrez le triangle de divulgation d'argument double cicl, contrôlez la liaison avec le propriétaire du fichier de sélection fox, la touche de modèle devrait être " auto ", le nom du sélecteur sera" openWindow: ", le même processus sera appliqué avec" Double-cliquez sur la cible " divulgation, Cela fonctionnera

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top