Zamiast tego naprawdę powinieneś używać tej metody:
CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
Wersja Swift:
let buttonPosition = sender.convert(CGPoint(), to:tableView)
let indexPath = tableView.indexPathForRow(at:buttonPosition)
To da ci podstawę w indexPath
oparciu o położenie przycisku, który został naciśnięty. Wtedy po prostu zadzwonisz, cellForRowAtIndexPath
jeśli potrzebujesz komórki lub indexPath.row
jeśli potrzebujesz numeru wiersza.
Jeśli masz paranoję, możesz sprawdzić if (indexPath) ...
przed użyciem, na wypadek gdyby indexPath
nie znaleziono tego punktu w widoku tabeli.
Wszystkie inne odpowiedzi prawdopodobnie się zepsują, jeśli Apple zdecyduje się zmienić strukturę widoku.
convertPoint:*to*View
nie jestconvertPoint:*from*View
. Kiedyś Xcode autouzupełniania i skończyło się metoda fromView prowadząc tylko nie działa ...Edycja: ta odpowiedź jest nieaktualna. Zamiast tego użyj tej metody
Spróbuj tego:
-(void)button1Tapped:(id)sender { UIButton *senderButton = (UIButton *)sender; UITableViewCell *buttonCell = (UITableViewCell *)[senderButton superview]; UITableView* table = (UITableView *)[buttonCell superview]; NSIndexPath* pathOfTheCell = [table indexPathForCell:buttonCell]; NSInteger rowOfTheCell = [pathOfTheCell row]; NSLog(@"rowofthecell %d", rowOfTheCell); }
Edycja: Jeśli używasz contentView, użyj tego zamiast buttonCell:
UITableViewCell *buttonCell = (UITableViewCell *)senderButton.superview.superview;
źródło
contentView
właściwości - więc to rozwiązanie tak naprawdę nie działa.Poleciłbym w ten sposób pobrać indexPath komórki, która ma dowolny niestandardowy podgląd - ( kompatybilny z iOS 7, jak również wszystkimi poprzednimi wersjami )
-(void)button1Tapped:(id)sender { //- (void)cellSubviewTapped:(UIGestureRecognizer *)gestureRecognizer { // UIView *parentCell = gestureRecognizer.view.superview; UIView *parentCell = sender.superview; while (![parentCell isKindOfClass:[UITableViewCell class]]) { // iOS 7 onwards the table cell hierachy has changed. parentCell = parentCell.superview; } UIView *parentView = parentCell.superview; while (![parentView isKindOfClass:[UITableView class]]) { // iOS 7 onwards the table cell hierachy has changed. parentView = parentView.superview; } UITableView *tableView = (UITableView *)parentView; NSIndexPath *indexPath = [tableView indexPathForCell:(UITableViewCell *)parentCell]; NSLog(@"indexPath = %@", indexPath); }
To też nie wymaga
self.tablview
.Zwróć również uwagę na skomentowany kod, który jest przydatny, jeśli chcesz to samo za pomocą @selektora UIGestureRecognizer dodanego do niestandardowego widoku podrzędnego.
źródło
Istnieją dwa sposoby:
@ H2CO3 ma rację. Możesz zrobić to, co sugerował @ user523234, ale z niewielką zmianą, aby uszanować UITableViewCellContentView, który powinien znaleźć się między UIButton i UITableViewCell. Aby zmodyfikować jego kod:
- (IBAction)button1Tapped:(id)sender { UIButton *senderButton = (UIButton *)sender; UITableViewCellContentView *cellContentView = (UITableViewCellContentView *)senderButton.superview; UITableViewCell *tableViewCell = (UITableViewCell *)cellContentView.superview; UITableView* tableView = (UITableView *)tableViewCell.superview; NSIndexPath* pathOfTheCell = [tableView indexPathForCell:tableViewCell]; NSInteger rowOfTheCell = pathOfTheCell.row; NSLog(@"rowofthecell %d", rowOfTheCell); }
Jeśli utworzysz niestandardową UITableViewCell (własną podklasę), możesz po prostu wywołać
self
IBAction. Możesz połączyć funkcję IBAction z przyciskiem za pomocą scenorysu lub programowo podczas konfigurowania komórki.- (IBAction)button1Tapped:(id)sender { UITableView* tableView = (UITableView *)self.superview; NSIndexPath* pathOfTheCell = [tableView indexPathForCell:self]; NSInteger rowOfTheCell = pathOfTheCell.row; NSLog(@"rowofthecell %d", rowOfTheCell); }
źródło
Zakładam, że dodajesz przyciski do komórki w
cellForRowAtIndexPath
, a następnie utworzę podklasę niestandardowej klasyUIButton
, dodasz tag o nazwierowNumber
i dołączasz te dane podczas dodawania przycisku do komórki.źródło
UIButton
dla niego podklasę .tag
jest wspólną własnościąUIView
.Inny prosty sposób:
Uzyskaj punkt kontaktu w tableView
Następnie pobierz ścieżkę indeksu komórki w punkcie
Ścieżka indeksu zawiera indeks wiersza
Kod to:
- (void)buttonTapped:(id)sender { UITapGestureRecognizer *tap = (UITapGestureRecognizer *)sender; CGPoint point = [tap locationInView:theTableView]; NSIndexPath *theIndexPath = [theTableView indexPathForRowAtPoint:point]; NSInteger theRowIndex = theIndexPath.row; // do your stuff here // ... }
źródło
Szybki 3
Uwaga: To powinno naprawdę znaleźć się w zaakceptowanej odpowiedzi powyżej, z wyjątkiem tego, że meta marszczy brwi na takie zmiany.
@IBAction func doSomething(_ sender: UIButton) { let buttonPosition = sender.convert(CGPoint(), to: tableView) let index = tableView.indexPathForRow(at: buttonPosition) }
Dwie drobne uwagi:
źródło
Jednym z rozwiązań mogłoby być sprawdzenie tagu podglądu przycisku lub nawet wyżej w hierarchii widoku (jeśli przycisk znajduje się w widoku zawartości komórki).
źródło
Chciałbym szybko udostępnić kod -
extension UITableView { func indexPathForCellContainingView(view1:UIView?)->NSIndexPath? { var view = view1; while view != nil { if (view?.isKindOfClass(UITableViewCell) == true) { return self.indexPathForCell(view as! UITableViewCell)! } else { view = view?.superview; } } return nil } }
źródło
Szybko:
@IBAction func buttonAction(_ sender: UIButton) { guard let indexPath = tableView.indexPathForRow(at: sender.convert(CGPoint(), to: tableView)) else { return } // do something }
źródło