Ich brauche meine Anwendung, um ein Fenster zu öffnen, wenn ein Benutzer auf eine Zeile in einem doppelklickt NSTableView
. Es fällt mir schwer, Informationen oder Beispiele zu finden, wie dies erreicht werden kann. Kann mich jemand in die richtige Richtung weisen?
cocoa
nstableview
double-click
Allyn
quelle
quelle
Hinzufügen grundlegenderer Informationen zu @ JimPuls Antwort zum Nutzen anderer Kakao-Neulinge.
Hier ist ein Auszug aus meinem Delegierten für die Tabellenansicht. Ich habe meinen Delegaten auch als Datenquelle eingerichtet, daher werden sowohl die damit verbundenen NSTableViewDelegate- als auch die NSTabeViewDataSource-Schnittstellen angezeigt.
// Schnittstellenauszug.
@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
// Implementierungsauszug.
@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... }
Hoffe das hilft.
quelle
Wie PR Singh sagte, können Sie Kakaobindungen verwenden, Sie können auch die ausgewählten Objekte weitergeben.
Wählen Sie Ihre Tabellenansicht in IB aus und richten Sie diese beiden Bindungen im Inspektor für Bindungen wie folgt ein:
>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:
Wo myMethod implementiert ist als
- (void)myMethod:(NSArray*)selectedObjects { NSLog(@"%@", selectedObjects); }
Dies ist auch hier dokumentiert: https://developer.apple.com/library/mac/qa/qa1472/_index.html
quelle
Wenn jemand nach einer schnellen 2.0-Version sucht: Das funktioniert bei mir. Scheint viel einfacher als der Objective C-Code.
@IBOutlet weak var searchResultTable: NSTableView! override func viewDidLoad() { super.viewDidLoad() searchResultTable.doubleAction = "doubleClickOnResultRow" } func doubleClickOnResultRow() { print("doubleClickOnResultRow \(searchResultTable.clickedRow)") }
quelle
doubleAction
Sie diesen Link .searchResultTable.doubleAction = #selector(doubleClickOnResultRow)
Sie können die Doppelklick-Aktion in Interface Builder verkabeln. Klicken Sie bei gedrückter Ctrl-Taste auf Ihre Tabellenansicht (stellen Sie sicher, dass Sie die Tabellenansicht erhalten , nicht die Bildlaufansicht oder die Clipansicht oder eine Tabellenspalte), um das Verbindungsfenster aufzurufen. Suchen Sie das Element "doubleAction" im Abschnitt "Gesendete Aktionen". Verbinden Sie es mit der IBAction Ihrer Wahl.
quelle
Unter SWIFT 4.1 Sie legen die doubleAction-Methode des TableView-Objekts in Ihrem Code so fest, dass eine @ objc-Funktion mithilfe eines #selector (nameOfYourFunction) ausgeführt wird.
Innerhalb dieser Funktion rufen Sie einen Segue auf. Sie können Ihr neues Fenster mit dem Ursprungsfenster von InterfaceBuilder verknüpfen (nicht mit dem NSTableView-Objekt, sondern mit dem eigentlichen ViewController-Objekt.
Führen Sie dann alle Einstellungen für das neue Fenster durch, um sich auf den Übergang vorzubereiten:
Okay zuerst auf Interface Builder:
Geben Sie diesem Abschnitt natürlich eine Kennung:
Als nächstes in unserem ersten View Controller (wo sich die Tabellenansicht befindet) 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 }
Dann brauchen wir eine Funktion, um den Übergang zum Doppelklick der Tabellenansicht durchzuführen. Diese Funktion wird mit einem #selector aufgerufen und muss daher für Objective C sichtbar sein (auch wenn wir in Swift programmieren). Wir starten die Funktion einfach mit @ Objc das ist es.
@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) } }
Schließlich setzen wir diese Funktion auf die doubleAction-Methode der TableView im ersten Setup-Teil unseres Codes wie folgt:
override func viewDidLoad() { super.viewDidLoad() thisTableView.doubleAction = #selector(doubleClickOnResultRow) }
quelle
Sie können dasselbe mit den Bindungen tun, indem Sie zunächst einen Mentod in der .h-Datei deklarieren
in der .m-Datei implementieren Sie das gleiche
-(IBAction)openWindow:(id)sender { //do something here; }
Gehen Sie zu der Spitze, in der Ihre Tabellenansicht vorhanden ist, wählen Sie die Tabellenansicht aus und erhalten Sie die vorletzte Registerkarte des Attributinspektors (Bindungen). Öffnen Sie das
double click argument
Offenlegungsdreieck Der Name lautet "openWindow:". Der gleiche Vorgang wird mit der Offenlegung "Doppelklickziel" durchgeführt. Dies funktioniertquelle
Alfreds Antwort für Swift 5 wurde aktualisiert
@IBOutlet weak var searchResultTable: NSTableView! override func viewDidLoad() { super.viewDidLoad() searchResultTable.target = self searchResultTable.doubleAction = #selector(doubleClickOnResultRow) } @objc func doubleClickOnResultRow() { print("doubleClickOnResultRow \(searchResultTable.clickedRow)") }
quelle