2013-04-26 9 views
9

Mam UITableview z wieloma komórkami. W każdej komórce dodam przyciski dynamicznie według pewnej liczby tablic. Tak więc po kliknięciu przycisku mogę uzyskać wartość przycisku tag. Ale jak uzyskać indexPath tej komórki?Jak uzyskać wartość indexPath z UIButton w UITableViewCell?

Oto mój kod w -cellForRowAtIndexPath:

UIView *view=(UIView*)[cell.contentView viewWithTag:indexPath.row+444]; 

    UIImageView *img=(UIImageView*)[cell.contentView viewWithTag:indexPath.row+999]; 
    img.image=[UIImage imageNamed:@"BHCS_empty.png"]; 

    if(integer!=50) 
    { 
     NSInteger y_axis=0; 
     NSArray *Arr=[tableSubCategoryArr objectAtIndex:indexPath.row]; 
     img.image=[UIImage imageNamed:@"BHCS_selected.png"]; 

     view.Frame= CGRectMake(0,50,281, integer-50); 
     for (int i=0; i<[Arr count]; i++) 
     { 
      NSLog(@"arr %@",[Arr objectAtIndex:i]); 
      UIButton *Btn=[UIButton buttonWithType: UIButtonTypeCustom]; 
      Btn.frame=CGRectMake(0, y_axis, 281, 44); 
      [Btn setImage:[UIImage imageNamed:@"BHCS_panel.png"] forState:UIControlStateNormal]; 
      [Btn addTarget:self action:@selector(subCategoryBtnClicked:) forControlEvents:UIControlEventTouchUpInside]; 
      [Btn setTag:i+100]; 
      [view addSubview:Btn]; 


      UILabel *nameLbl=[[UILabel alloc]initWithFrame:CGRectMake(20, y_axis,248, 44)]; 
      nameLbl.text = [[Arr objectAtIndex:i]objectForKey:@"SubCategoryName"]; 
      nameLbl.textColor = [UIColor whiteColor]; 
      nameLbl.backgroundColor=[UIColor clearColor]; 
      panelTableView.separatorColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"BHCS_panel_div1.png"]]; 
      nameLbl.font = [UIFont fontWithName:@"Helvetica" size:12.0f]; 
      [view addSubview:nameLbl]; 

      y_axis=y_axis+44+1.3f; 
     } 
    } 
+0

Łatwym sposobem na to jest utworzenie rozszerzenia UITableView. Zobacz moją odpowiedź na [to pytanie] (https://stackoverflow.com/a/39059239/3395921), aby zobaczyć, jak można to zrobić. –

Odpowiedz

6

Dzięki wszystkim i slove to za pomocą poniższego kodu

 NSIndexPath *indexPath = [panelTableView indexPathForCell:(UITableViewCell *)sender.superview.superview]; 

NSLog(@"%d",indexPath.row); 
+3

w iOS8..to zawsze da 0. Zobacz proszę .... http: //stackoverflow.com/questions/23784630/how- to-find-indexpath-for-tap-button-in-tableview-using-seque/27292570 # 27292570 –

+0

Nie używaj tej odpowiedzi. To jest złe. Nigdy nie należy przyjmować określonej struktury dla hierarchii widoku prywatnego. – rmaddy

-1

Można użyć indexPathForCell: metodę UITableView jest taka jak [tableView indexPathForCell:cell];. Powodzenia!

+0

gdzie powinienem użyć tej linii? – user2230971

5

Updated odpowiedź

używać go jak:

CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.tableView]; 
NSIndexPath *hitIndex = [self.tableView indexPathForRowAtPoint:hitPoint]; 
+0

ulega awarii w NSIndexPath * indexPath = [view indexPathForCell: cell]; – user2230971

+0

Czy dodajesz swój guzik bezpośrednio do komórki? Jeśli nie, musisz przejść do trybu supervisor, aż dotrzesz do komórki takiej jak button.superview.superview i tak dalej. Proszę sprawdzić typ komórki podczas debugowania, to pomoże. – Amit

+4

NIE, NIE NIE NIE! Po prostu nie przeglądaj superdysków! http://stackoverflow.com/questions/9274494/how-to-know-the-uitableview-row-number/9274863#9274863 – CW0007007

0

Umieść ten kod w metodzie działania przycisku to:

NSIndexPath *indexPath = [yourtableviewname indexPathForCell:(UITableViewCell *)sender.superview]; 
    NSLog(@"%d",indexPath.row); 
+0

, ale za każdym razem, gdy powtarza się zerującą ścieżkę indeksu – user2230971

+0

w kodzie, dodajesz przycisk, aby zobaczyć, dlaczego to daje 0 wartości oznacza tutaj sender.superview podany jako widok, tak myślę. – Balu

+0

hej próbowałem jak to działa dobrze teraz w akcji przycisku – user2230971

9

ALLLLL z odpowiedzi tutaj są złe i nie powinieneś przechodzić przez superview. Klasyczny przykład, w systemie iOS 7 Apple zmieniono hierarchię tableViewCell, a Twoja aplikacja ulegnie awarii!

Użyj tego zamiast:

How to know the UITableview row number

+0

oh. To była tak krótka, łącząca tylko odpowiedź, której prawie brakowało, ale w rzeczywistości jest naprawdę dobra. Chodzi o to, że przycisk zawiera informacje o tym, gdzie był na ekranie, który można łatwo przekonwertować na ścieżkę indeksu. – Suz

+0

Czy chcesz zakwalifikować się jako "zły"? Określona zależność od [viewview] niektórych może się z czasem zepsuć (nawet jeśli cała hierarchia widoków jest kontrolowana przez programistę aplikacji). Pętla w górę, dopóki nie znajdzie się komórki widoku tabeli, jest z pewnością bezpieczna teraz iw przyszłości. – danh

0

Proponuję dodać obiekt do niestandardowego UITableViewCell klasie realizacji przechowywać indexPath. Następnie, gdy deleger cellForRowAtIndexPath zostanie uruchomiony w TableViewController, ustaw właściwość indexPath dla tej komórki.

customTableViewCell.h:

@interface customTableViewCell : UITableViewCell 

@property NSIndexPath *indexPath; 

@end 

komórka customTableViewController configure:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    customTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customTableViewCell" forIndexPath:indexPath]; 
    // Do whatever you want with your cell 
    cell.indexPath = indexPath; 

    return cell; 
} 

Następnie można odwołać się do własności indexPath w swojej customTableViewCell wywołując self.indexPath

+1

Nie, nie rób tego. Jeśli widok tabeli umożliwia usuwanie, wstawianie lub przenoszenie wierszy, właściwość 'indexPath' tej komórki niestandardowej będzie niepoprawna. – rmaddy

23

Próbowałem maksymalna z podanych odpowiedzi, ale na i generalnie używam, aby przejść do najbardziej Ogólny i idealny sposób w następujący sposób:

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView]; 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition]; 
+0

Super ... w Swift niech Hitpoint = sender.convert (CGPoint.zero do: self.tablename) niech indexpath_select = self.Flight_detail_table.indexPathForRow (pod adresem: Hitpoint) print ("indexpath: \ (String (opis: indexpath_select)) ") –

0

Żadna z tych odpowiedzi nie wydaje się być bardzo czystym rozwiązaniem. Sposób, w jaki mogę to zaimplementować, polega na użyciu wzorca delegatów. Kontroler widoku jest delegatem komórki, co oznacza, że ​​pozwala się komórce obsłużyć naciśnięcie przycisku, i informuje delegata, gdy przycisk został wciśnięty, aby mógł obsłużyć to, jak chce.

Załóżmy, że masz widok tabeli, w którym każda komórka reprezentuje obiekt Person, a po naciśnięciu przycisku chcesz wyświetlić profil tej osoby.Wszystko, co musisz zrobić to:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customTableViewCell" forIndexPath:indexPath]; 
    cell.delegate = self; 
    cell.person = self.people[indexPath.row]; 
    return cell; 
} 

- (void)personCell:(PersonCell *)personCell didPressButtonForPerson:(Person *)person { 
    [self showProfileForPerson:person]; 
} 

Wtedy wszystko, co trzeba zrobić w swojej klasie przycisk jest dodać właściwość o nazwie buttonPressedHandler że jest blok przechodzi z powrotem wystąpienie Person, a podczas tworzenia przycisku i dodać cel coś takiego:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // do whatever whatever else you need/want to here 

    [self.button addTarget:self selector:@selector(handleButtonPressed) forState:UIControlStateNormal]; 
} 

- (void)handleButtonPressed { 
    // Make sure this is a required delegate method, or you check that your delegate responds to this selector first... 
    [self.delegate personCell:self didPressButtonForPerson:self.person]; 
} 
Powiązane problemy