Domanda

Ho bisogno che la mia applicazione apra una finestra quando un utente fa doppio clic su una riga in un NSTableView . Sto incontrando un po 'di difficoltà a trovare informazioni o esempi su come ottenere questo risultato. Qualcuno può indicarmi la giusta direzione?

È stato utile?

Soluzione

Dai un'occhiata a -setDoubleAction: metodo su NSTableView; puoi impostarlo su un metodo che verrà chiamato proprio come il normale sistema di azione-bersaglio ma con un doppio clic.

In quel metodo di azione, -clickedRow sarà utile.

Altri suggerimenti

Aggiunta di ulteriori informazioni di base alla risposta di @JimPuls a beneficio di altri nuovi arrivati ??in Cocoa.

  1. Un IBOutlet su NSTableView deve essere dichiarato in un'interfaccia. Ho pensato che fosse preferito farlo nel delegato della tabella.
  2. L'IBOutlet alla tabella deve essere collegato tramite Interface Builder. Per farlo Ctrl-Drag & amp; Inserisci IB dalla classe che dichiara lo sbocco alla vista tabella. Quando rilasci il mouse, dovrebbe apparire un popup con il nome della presa dichiarata al punto 1. Seleziona quello.
  3. Nella sezione @implementation, sul metodo -awakeFromNib, chiama -setTarget: e -setDoubleAction: sull'IBOutlet dichiarato nel passaggio # 1 e connesso nel passaggio # 2.

Ecco un estratto dal mio delegato di visualizzazione tabella. Ho anche il mio delegato impostato come origine dati, per questo vedrai entrambe le interfacce NSTableViewDelegate e NSTabeViewDataSource associate.

// Estratto dell'interfaccia.

@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

// Estratto di implementazione.

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

Spero che questo aiuti.

Come ha detto PR Singh, puoi usare le associazioni di cacao, puoi anche passare gli oggetti selezionati.

  1. Seleziona la vista tabella in IB, quindi nella finestra di ispezione Associazioni imposta queste due associazioni come segue:

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

Dove myMethod è implementato come

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

Questo è anche documentato qui: https://developer.apple.com/library/mac/qa/ qa1472 / _index.html

Se qualcuno cerca una versione 2.0 rapida: Questo è ciò che funziona per me. Sembra molto più semplice del codice Obiettivo C.

@IBOutlet weak var searchResultTable: NSTableView!

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

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

Puoi collegare l'azione del doppio clic in Interface Builder. Fai clic tenendo premuto il tasto Ctrl sulla visualizzazione della tabella (assicurati di ottenere la visualizzazione tabella , non la visualizzazione scorrimento o la visualizzazione clip o una colonna della tabella) per ottenere il relativo pannello delle connessioni. Trova & # 8220; doubleAction & # 8221; elemento in & # 8220; Azioni inviate & # 8221; sezione. Collegalo all'azione IB di tua scelta.

Su SWIFT 4.1 È possibile impostare il metodo doubleAction dell'oggetto TableView all'interno del codice per eseguire una funzione @objc utilizzando un #selector (nameOfYourFunction)

All'interno di questa funzione si chiama a segue. Puoi collegare la tua nuova finestra alla finestra di origine su InterfaceBuilder (non all'oggetto NSTableView ma all'oggetto ViewController effettivo.

Quindi esegui tutte le impostazioni per la nuova finestra in preparazione per segue:

Va ??bene prima su Interface Builder:

 inserisci qui la descrizione dell'immagine

Ovviamente dare un identificatore a ciò che segue:

 inserisci qui la descrizione dell'immagine

Successivamente, all'interno del nostro primo controller di visualizzazione (dove si trova la vista tabella) codice:

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

Quindi abbiamo bisogno di una funzione per eseguire il seguito sul doppio clic della vista tabella, questa funzione viene chiamata con un #selector e quindi deve essere visibile all'Obiettivo C (anche se stiamo programmando in Swift) semplicemente iniziamo il funzione con @Objc questo è tutto.

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

Infine impostiamo questa funzione sul metodo doubleAction di TableView nella parte di installazione iniziale del nostro codice in questo modo:

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

Puoi fare la stessa cosa con i binding, prima di tutto dichiarare un mentod nel file .h

-(IBAction)openWindow:(id)sender

nel file .m implementa lo stesso

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

è arrivato a quel punto in cui è presente la vista della tabella, seleziona la vista della tabella e ha ottenuto la seconda ultima scheda della finestra di ispezione degli attributi, apri il doppio triangolo argomento divulgazione controllo triangolo rilegatura per controllare il proprietario del file di fox select, il modello chiave pat dovrebbe essere " self " ;, il nome del selettore sarà " openWindow: " ;, lo stesso processo fa con " Target doppio clic " rivelazione, Questo funzionerà

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top