Fare doppio clic su una riga NSTableView in Cocoa?
-
05-07-2019 - |
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?
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.
- Un IBOutlet su NSTableView deve essere dichiarato in un'interfaccia. Ho pensato che fosse preferito farlo nel delegato della tabella.
- 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.
- 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.
-
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:
Ovviamente dare un identificatore a ciò che segue:
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à