2012-04-18 11 views
7

Wie erhalten Sie die Zeile für eine Schaltfläche in einer View-basierten Tabelle, wenn Sie auf die Schaltfläche klicken? Die Zeile ist nicht ausgewählt, wenn auf die Schaltfläche geklickt wird, aber ich habe festgestellt, dass wenn Sie sender.superview.superview in der Aktionsmethode der Schaltfläche protokollieren, NSTableRowView: 0x1001b3a90 - row: 2. Die Zeile befindet sich also im Protokoll. aber ich weiß nicht, wie ich programmatisch darauf zugehen soll. Ich habe die Aktionsmethode der Schaltfläche in einer Unterklasse von NSTableCellView.Holen Sie sich die Schaltfläche Zeile in View-basierte Tabelle

Antwort

8

-[NSTableView rowForView:] sagt dies in seiner Dokumentation:

Diese Regel im Aktionsverfahren für einen NSButton (oder NSControl) benötigt wird, um herauszufinden, welche Zeile (und Spalte) die Aktion auf durchgeführt werden sollte.

+0

Danke, das ist das, was ich brauchte. Ich kann die Tabellenansicht in der Aktionsmethode der Schaltfläche von sender.superview.superview.superview und die Ansicht von sender.superview erhalten – rdelmar

+0

Die Aktion sollte an einen Controller gesendet werden, und dieser Controller sollte die Tabellenansicht kennen. Es sollte eine Steckdose haben. Also sollte es nicht notwendig sein, der Superview-Kette zu folgen. Und Sie können "sender" einfach als Argument für "-rowForView:" übergeben, da es die Zeile mit der Ansicht direkt oder indirekt nachschlägt. –

+0

Ich habe ein paar Tests gemacht, nur um zu sehen, wie ich verschiedene UI-Elemente in einer View-basierten Tabelle manipulieren kann. Anfangs hatte ich die Aktionsmethode im App-Delegate (der Einfachheit halber) und wurde nie aufgerufen. Dann lege ich es in die benutzerdefinierte Tabellenzellenansicht, weil ich irgendwo gelesen habe, dass es dort sein sollte. Wie Sie in Ihrem Kommentar gesagt haben, scheint es wirklich, dass es in einem Controller-Objekt sein sollte, aber gibt es einige Einschränkungen, wohin es gehen kann, damit es funktioniert? Warum hat es im App-Delegierten nicht funktioniert? Ich bin mir nicht sicher, wie die Responder-Kette für eine View-basierte Tabelle aussieht. – rdelmar

1

Hier gebe ich Ihnen ein einfaches Beispiel. In diesem bin ich ein UIButton in der Inhaltsansicht hinzufügen. Wenn ich auf die Schaltfläche geklickt rufe ich eine Methode und dort bekomme ich Zeilennummer und rufen Sie wie ich

//Adding a button 
    UIButton *btnBuyer=[UIButton buttonWithType:UIButtonTypeCustom]; 
    btnBuyer.frame=CGRectMake(238, 10, 26, 32); 
    btnBuyer.tag=indexPath.row; 
    [btnBuyer setImage:[UIImage imageNamed:@"buyIcon.png"] forState:UIControlStateNormal]; 
    [btnBuyer addTarget:self action:@selector(goBuyTab:)forControlEvents:UIControlEventTouchUpInside]; 
    [cellNew.contentView addSubview:btnBuyer]; 

erforderlich, und wenn Benutzer auf diese Klicks habe ich Id aus der folgenden Methode

-(void)goBuyTab:(UIButton *)sender{ 
    NSLog(@"after click buy button function called goBuyTab"); 
    NSLog(@"sender.tag in goBuyTab : %d",sender.tag); 
    int selectedRow=sender.tag;// This is row number 
} 

Hope this ist was du verlangst.

-1

in osx können Sie diese Zelle Aktionsmethode in Ihrer Schaltfläche in der Steuerung verwenden:

- (IBAction)yourMethod:(NSButtonCell *)sender { 

NSInteger selected = [yourTableView selectedRow]; 
NSLog(@"sender sends :%ld", selected); 
} 

benötigen Sie einen Austritt aus der Steuerung zum NSTableView einzustellen.

+0

Dies funktioniert nicht immer, da es durchaus möglich ist, auf eine Schaltfläche in einer Zeile zu klicken, ohne die zugrunde liegende Zeile auszuwählen. – Ely

+0

Es funktioniert auch nicht, weil (in einer zellenbasierten Tabellenansicht) 'sender' das' NSTableView' ist, nicht das 'NSButtonCell'. –

0

ich diesen Code teilen für Swift 4.

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 
    ........ 
    but.action = #selector(ViewController.buttonAction) 
    ......... 
} 

@objc func buttonAction(but: NSButton){ 
    let tablerow: NSTableRowView = but.superview?.superview as! NSTableRowView; 
    let index = table?.row(for: tablerow); 
    print("\(index)); 
} 
Verwandte Themen