2012-04-18 15 views
7

Jak uzyskać wiersz dla przycisku w tabeli opartej na widoku po kliknięciu przycisku? Wiersz nie jest zaznaczony po kliknięciu przycisku, ale odkryłem, że jeśli logujesz sender.superview.superview w metodzie akcji przycisku, otrzymuję: NSTableRowView: 0x1001b3a90 - wiersz: 2. A więc wiersz znajduje się w dzienniku, ale nie wiem, jak to zrobić programowo. Mam metodę działania przycisku w podklasie NSTableCellView.Pobierz wiersz przycisku w widoku tabeli

Odpowiedz

8

-[NSTableView rowForView:] mówi, że to w jego dokumentacji:

ta jest zazwyczaj potrzebne w sposobie działania na rzecz NSButton (lub NSControl), aby dowiedzieć się, jakie rząd (i kolumna) działanie powinno być przeprowadzone na.

+0

Dzięki, to jest to, czego potrzebowałem. Mogę uzyskać widok tabeli w metodzie akcji przycisku z sender.superview.superview.superview i widok z sender.superview – rdelmar

+0

Akcja powinna zostać wysłana do kontrolera, a kontroler powinien znać widok tabeli. Powinien mieć wylot. Tak więc nie powinno to wymagać śledzenia łańcucha podglądu. I możesz po prostu przekazać 'sender' jako argument' -rowForView: ', ponieważ wyszukuje wiersz zawierający, bezpośrednio lub pośrednio, widok. –

+0

Przeprowadzałem testy, aby zobaczyć, w jaki sposób mogę manipulować różnymi elementami interfejsu użytkownika w tabeli opartej na widoku, więc początkowo miałem metodę działania w delegacie aplikacji (dla uproszczenia) i to nigdy nie było wywoływane. Następnie umieściłem to w widoku komórki niestandardowej tabeli, ponieważ przeczytałem gdzieś, że tam właśnie powinno być. Jak wspomniałeś w swoim komentarzu, wydaje się, że powinien on znajdować się w obiekcie kontrolera, ale czy istnieją pewne ograniczenia dotyczące tego, gdzie może on działać? Dlaczego nie działa w delegacie aplikacji? Nie jestem pewien, jak wygląda łańcuch odpowiadający dla tabeli opartej na widoku. – rdelmar

1

Podam tutaj prosty przykład. W tym dodam UIButton w widoku zawartości. Po kliknięciu na przycisk I wywołać metodę i tam uzyskać numer wiersza i zadzwoń jak wymagane

//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]; 

A gdy użytkownik kliknie na ten temat mam Id z następującym sposobem

-(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 
} 

nadzieję, że to czego potrzebujesz.

-1

w OSX można to wykorzystać w swoim sposobie działania guzikowa w kontrolerze:

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

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

trzeba ustawić wylot z regulatora do NSTableView.

+0

To nie zawsze działa, ponieważ można kliknąć przycisk w wierszu bez wybierania odpowiedniego wiersza. – Ely

+0

To również nie działa, ponieważ (w widoku tabeli opartym na komórce) 'sender' jest' NSTableView', a nie 'NSButtonCell'. –

0

dzielę ten kod 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)); 
}