webentwicklung-frage-antwort-db.com.de

Doppelklicken Sie auf eine NSTableView-Zeile in Cocoa?

Ich brauche meine Anwendung, um ein Fenster zu öffnen, wenn ein Benutzer in einer NSTableView auf eine Zeile klickt. Es fällt mir schwer, Informationen oder Beispiele zu finden, wie man dies erreichen kann. Kann mich jemand in die richtige Richtung weisen?

65
Allyn

Schauen Sie sich die Methode -setDoubleAction: in NSTableView an. Sie können dies auf eine Methode festlegen, die genauso wie das normale Zielaktionssystem aufgerufen wird, jedoch auf einen Doppelklick.

In dieser Aktionsmethode ist -clickedRow nützlich.

123
Jim Puls

Hinzufügen weiterer grundlegender Informationen zu @JimPuls answer zum Nutzen anderer Neuankömmlinge bei Cocoa.

  1. Ein IBOutlet für die NSTableView muss in einer Schnittstelle deklariert werden. Ich nahm an, dass dies lieber im Delegierten des Tisches ist.
  2. Das IBOutlet mit der Tabelle muss über den Interface Builder verbunden sein. Dazu Strg-Drag & Drop in IB aus der Klasse, die den Auslass für die Tabellenansicht deklariert. Wenn Sie die Maustaste loslassen, sollte ein Popup mit dem Namen der in Schritt 1 angegebenen Steckdose angezeigt werden. Das auswählen.
  3. Rufen Sie im Abschnitt @implementation für die Methode -awakeFromNib -setTarget: und -setDoubleAction: für das in Schritt 1 deklarierte und in Schritt 2 verbundene IBOutlet auf.

Hier ist ein Auszug aus meinem Delegierten für die Tabellenansicht. Ich habe meinen Stellvertreter auch als Datenquelle eingerichtet. Deshalb werden Ihnen sowohl die Schnittstellen NSTableViewDelegate als auch die Schnittstellen NSTabeViewDataSource 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.

54
amateur barista

Wie PR Singh gesagt hat, können Sie Kakaobindungen verwenden, Sie können auch die ausgewählten Objekte weiterleiten.

  1. Wählen Sie Ihre Tabellenansicht in IB aus, und legen Sie im Bindungsinspektor diese beiden Bindungen wie folgt fest:

    >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

10
GeoffCoope

Wenn jemand nach einer Swift 2.0-Version sucht: 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)")
}
7
Alfred Schilken

Sie können die Doppelklick-Aktion im Interface Builder miteinander verbinden. Klicken Sie bei gedrückter Strg-Taste auf Ihre Tabellenansicht (vergewissern Sie sich, dass Sie die table -Ansicht nicht die Bildlaufansicht oder die Clipansicht oder eine Tabellenspalte erhalten), um den Bereich "Verbindungen" anzuzeigen. Suchen Sie das Element "doubleAction" im Abschnitt "Gesendete Aktionen". Verbinden Sie es mit der IBAction Ihrer Wahl.

6
rob mayoff

Auf Swift 4.1 Sie können die doubleAction-Methode des TableView-Objekts in Ihrem Code so einstellen, dass eine @objc-Funktion mithilfe eines #selector (nameOfYourFunction) ausgeführt wird.

Innerhalb dieser Funktion rufen Sie ein Segment auf. Sie können Ihr neues Fenster mit dem Origin-Fenster in InterfaceBuilder verknüpfen (nicht mit dem NSTableView-Objekt, sondern dem eigentlichen ViewController-Objekt).

Nehmen Sie dann alle Einstellungen für das neue Fenster vor, um das Segue vorzubereiten:

In Ordnung, zuerst im Interface Builder:

 enter image description here

Natürlich geben Sie diesem Segment einen Bezeichner:

 enter image description here

Als nächstes in unserem ersten View-Controller-Code (wo sich die Tabellenansicht befindet):

 //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 benötigen wir eine Funktion, um den Doppelklick auf die Tabellensicht auszuführen. Diese Funktion wird mit einem #selector aufgerufen und muss daher für Objective C sichtbar sein (selbst wenn wir in Swift programmieren). 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)
 }
}

Zum Schluss setzen wir diese Funktion auf die doubleAction-Methode der TableView im anfänglichen Setup-Teil unseres Codes wie folgt:

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

Sie können dasselbe mit den Bindungen tun, indem Sie zunächst ein Mentod in der .h-Datei deklarieren

-(IBAction)openWindow:(id)sender

in .m Datei das gleiche implementieren

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

zu der Spitze gelangt, in der Ihre Tabellenansicht vorhanden ist, wählen Sie die Tabellenansicht aus und haben Sie die vorletzte Registerkarte des Attribut-Inspektors geöffnet Name wird "openWindow:" sein, derselbe Prozess wird mit der Anzeige "Doppelklickziel", .__ durchgeführt. Dies wird funktionieren

0
PR Singh