Doppelklicken Sie auf ein NSTableView Zeile in Cocoa?
-
05-07-2019 - |
Frage
ich meine Bewerbung benötigen ein Fenster zu öffnen, wenn ein Benutzer doppelklickt auf einer Zeile in einer NSTableView
. Ich bin ein bisschen eine schwierige Zeit mit Informationen oder Beispiele zu finden, wie dies zu erreichen. Kann jemand mich in die richtige Richtung?
Lösung
Werfen Sie einen Blick auf die -setDoubleAction:
Methode auf NSTableView; Sie können, dass ein Verfahren festgelegt, die genau wie die normale Ziel-Action-System, sondern auf einem Doppelklick.
In dieser Action-Methode, -clickedRow
nützlich sein wird.
Andere Tipps
Das Hinzufügen von mehr Basisinformationen zu @JimPuls zum Nutzen anderer Newcomer Cocoa beantworten.
- Ein IBOutlet zum NSTableView muss in einer Schnittstelle deklariert werden. Ich nahm an, es wird bevorzugt, um in der Tabelle des Delegierten zu tun.
- Die IBOutlet auf den Tisch muss über Interface Builder angeschlossen werden. Um das zu tun Ctrl-Drag & Drop in IB aus der Klasse, die den Auslass der Tabellenansicht erklärt. Wenn Sie die Maus loslassen sollte ein Popup mit dem Namen des Ausgangs erscheinen Sie in Schritt 1 # erklärt. Wählen Sie das.
- Im @implementation Abschnitt, auf der -awakeFromNib Methode, rufen -setTarget: und -setDoubleAction: auf den IBOutlet in Schritt # 1 erklärt, und im Schritt # 2 verbunden .
Hier ist ein Auszug aus meinem Tisch Ansicht delegieren. Ich habe meine Delegierten auch als Datenquelle einrichten, so dass ist, warum Sie mit ihm verbunden, sowohl die NSTableViewDelegate und NSTabeViewDataSource Schnittstellen sehen werden.
// Interface-Auszug.
@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
// Implementierung Auszug.
@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...
}
Hope, das hilft.
Als PR Singh sagte, man Kakao Bindungen verwenden können, können Sie auch entlang der selectedObjects passieren.
-
Wählen Sie Ihre Tabellenansicht in IB dann in Bindings Inspektor festgelegt werden, diese beiden Bindungen sich wie folgt zusammen:
>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 als
implementiert- (void)myMethod:(NSArray*)selectedObjects
{
NSLog(@"%@", selectedObjects);
}
Dies ist auch hier dokumentiert: https://developer.apple.com/library/mac/qa/ qa1472 / _index.html
Wenn jemand sucht nach einer schnellen Version 2.0: Dies ist, was für mich funktioniert. 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)")
}
Sie können die Doppelklick-Aktion im Interface Builder verdrahten. Control-Klick Ihre Tabellenansicht (stellen Sie sicher, dass Sie immer die Tabellenansicht , nicht die Scroll-Ansicht oder die Clip-Ansicht oder eine einspaltige Tabelle) seine Verbindungen Platte zu erhalten. Finden Sie den „Double“ Artikel in dem „Gesendet Aktionen“ Abschnitt. Schließen Sie es an die IBAction Ihrer Wahl.
Auf SWIFT 4.1 Sie legen die Doubleaction Methode des Tableview-Objekt in Ihrem Code eine @objc Funktion auszuführen, indem ein #selector (nameOfYourFunction) mit
Innerhalb dieser Funktion rufen Sie eine segue. Sie können Ihr neues Fenster zum Ursprung Fenster auf Interface (nicht auf das NSTableView Objekt, sondern die tatsächliche Viewcontroller-Objekt verknüpfen.
Dann tun Sie alle Ihre Setup für das neue Fenster für segue auf vorbereiten:
In Ordnung zuerst auf Interface Builder:
Natürlich gibt eine Kennung zu diesem segue:
Als nächstes werden in unserem ersten View-Controller (wo die Tabellenansicht ist) 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 die Segue auf die Tabellenansicht des Doppelklick ausführen, wird diese Funktion mit einem #selector genannt und muss daher sichtbar zu Objective-C sein (auch, dass wir in Swift sind programing) wir einfach nur den Anfang Funktion 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 setzten wir diese Funktion auf die Doubleaction Methode des Tableview in dem Ersteinrichtung Teil unseres Code wie folgt:
override func viewDidLoad() {
super.viewDidLoad()
thisTableView.doubleAction = #selector(doubleClickOnResultRow)
}
Sie können mit den Bindungen gleiche tun, zunächst einmal ein mentod in .h-Datei deklarieren
-(IBAction)openWindow:(id)sender
in .m-Datei implementieren die gleiche
-(IBAction)openWindow:(id)sender
{
//do something here;
}
bekam zu dieser Spitze, wo Ihre Tabellenansicht vorhanden ist, wählen Sie Tabellenansicht ist und bekam binden die die zweite letzte Registerkarte Attribut Inspektor, offenes Doppel CICL Argument Aufklappdreieck Prüfung Fuchs wählen Sie die Datei des Besitzers, Modellschlüssel pat sein sollte „selbst überprüfen Openwindow“, wird Selektorname sein‚:‘, gleichen Prozess zu tun mit‚klicken Sie doppelt Ziel‘Offenlegung, Dies funktioniert