Eu tenho um controlador tableview que exibe uma linha de células. Cada célula possui 3 botões. Eu numerei as marcas para cada célula como 1,2,3. O problema é que não sei como descobrir em qual célula um botão está sendo pressionado. No momento, só estou obtendo a etiqueta do remetente quando um dos botões é pressionado. Existe uma maneira de obter o número da linha da célula também quando um botão é pressionado?
fonte
convertPoint:*to*View
não éconvertPoint:*from*View
. Usei o preenchimento automático do Xcode e acabei com o método fromView levando apenas a não funcionar ...Edit: Esta resposta está desatualizada. Use este método
Experimente isto:
-(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); }
Editar: se você estiver usando contentView, use isso para buttonCell:
UITableViewCell *buttonCell = (UITableViewCell *)senderButton.superview.superview;
fonte
contentView
propriedade - portanto, essa solução realmente não funciona.Eu recomendaria esta maneira de buscar indexPath da célula que tem qualquer subvisualização personalizada - ( compatível com iOS 7, bem como com todas as versões anteriores )
-(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); }
Isso também não exige
self.tablview
.Além disso, observe o código comentado, que é útil se você quiser o mesmo por meio de um @selector de UIGestureRecognizer adicionado à sua subvisualização personalizada.
fonte
Existem duas maneiras:
@ H2CO3 está certo. Você pode fazer o que @ user523234 sugeriu, mas com uma pequena alteração, para respeitar o UITableViewCellContentView que deve vir entre o UIButton e o UITableViewCell. Então, para modificar seu código:
- (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); }
Se você criar um UITableViewCell personalizado (sua própria subclasse), poderá simplesmente chamar
self
a IBAction. Você pode vincular a função IBAction ao seu botão usando storyboard ou programaticamente ao configurar a célula.- (IBAction)button1Tapped:(id)sender { UITableView* tableView = (UITableView *)self.superview; NSIndexPath* pathOfTheCell = [tableView indexPathForCell:self]; NSInteger rowOfTheCell = pathOfTheCell.row; NSLog(@"rowofthecell %d", rowOfTheCell); }
fonte
Suponho que você adicione botões à célula
cellForRowAtIndexPath
, então o que eu faria é criar uma subclasse de classe personalizadaUIButton
, adicionar uma tag chamadarowNumber
e anexar esses dados enquanto você adiciona o botão à célula.fonte
UIButton
para isso.tag
é uma propriedade comum deUIView
.Outra maneira simples:
Obtenha o ponto de contato em tableView
Em seguida, obtenha o caminho do índice da célula no ponto
O caminho do índice contém o índice da linha
O código é:
- (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 // ... }
fonte
Swift 3
Nota: Isso realmente deveria ir na resposta aceita acima, exceto que meta desaprova tais edições.
@IBAction func doSomething(_ sender: UIButton) { let buttonPosition = sender.convert(CGPoint(), to: tableView) let index = tableView.indexPathForRow(at: buttonPosition) }
Dois pequenos comentários:
fonte
Uma solução poderia ser verificar a tag da supervisão do botão ou até mesmo mais alto na hierarquia de visão (se o botão estiver na visão de conteúdo da célula).
fonte
Eu gostaria de compartilhar o código em swift -
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 } }
fonte
Rapidamente:
@IBAction func buttonAction(_ sender: UIButton) { guard let indexPath = tableView.indexPathForRow(at: sender.convert(CGPoint(), to: tableView)) else { return } // do something }
fonte