[objective-c] 버튼을 누를 때 UITableView 셀 행 가져 오기

셀 행을 표시하는 tableview 컨트롤러가 있습니다. 각 셀에는 3 개의 버튼이 있습니다. 각 셀의 태그 번호를 1,2,3으로 지정했습니다. 문제는 버튼이 눌러지는 셀을 찾는 방법을 모른다는 것입니다. 나는 현재 버튼 중 하나를 눌렀을 때만 보낸 사람의 태그를 받고 있습니다. 버튼을 눌렀을 때 셀 행 번호를 얻는 방법이 있습니까?



답변

대신이 방법을 사용해야합니다.

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

Swift 버전 :

let buttonPosition = sender.convert(CGPoint(), to:tableView)
let indexPath = tableView.indexPathForRow(at:buttonPosition)

즉, 당신에게 줄 것이다 indexPath누른 버튼의 위치에 따라. 그런 다음 cellForRowAtIndexPathindexPath.row이 필요하거나 행 번호가 필요한 경우 전화 하면됩니다 .

편집증이라면 테이블 뷰에서 해당 지점을 찾을 수없는 if (indexPath) ...경우를 대비하여 사용하기 전에 확인할 수 indexPath있습니다.

Apple이 뷰 구조를 변경하기로 결정하면 다른 모든 답변이 깨질 수 있습니다.


답변

편집 :이 답변은 구식입니다. 대신이 방법을 사용하십시오.


이 시도:

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

편집 : contentView를 사용하는 경우 대신 buttonCell에 사용하십시오.

UITableViewCell *buttonCell = (UITableViewCell *)senderButton.superview.superview;


답변

사용자 지정 하위보기가있는 셀의 indexPath를 가져 오려면이 방법을 사용하는 것이 좋습니다 ( iOS 7 및 모든 이전 버전과 호환 가능 ).

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

이것도 필요하지 않습니다 self.tablview.

또한 사용자 지정 하위보기에 추가 된 UIGestureRecognizer의 @selector를 통해 동일한 코드를 원하는 경우 유용한 주석 처리 된 코드를 확인하십시오.


답변

두 가지 방법이 있습니다.

  1. @ H2CO3가 맞습니다. @ user523234가 제안한 작업을 수행 할 수 있지만 UIButton과 UITableViewCell 사이에 있어야하는 UITableViewCellContentView를 존중하기 위해 약간의 변경이 있습니다. 그래서 그의 코드를 수정하려면 :

    - (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);
    }
    
  2. 사용자 지정 UITableViewCell (자신의 하위 클래스)을 만드는 경우 selfIBAction에서 간단히 호출 할 수 있습니다 . 스토리 보드를 사용하거나 셀을 설정할 때 프로그래밍 방식으로 IBAction 함수를 단추에 연결할 수 있습니다.

    - (IBAction)button1Tapped:(id)sender
    {
        UITableView* tableView = (UITableView *)self.superview;
        NSIndexPath* pathOfTheCell = [tableView indexPathForCell:self];
        NSInteger rowOfTheCell = pathOfTheCell.row;
        NSLog(@"rowofthecell %d", rowOfTheCell);
    }
    


답변

나는 당신이 셀에 버튼을 추가 가정 cellForRowAtIndexPath하고 내가 무엇을 할 것이라고하는 것은 사용자 정의 클래스의 서브 클래스를 만드는 것입니다 UIButtonA, 추가 태그 라는 rowNumber데이터는 셀에 버튼을 추가하는 동안 것을, 그리고 APPEND를.


답변

또 다른 간단한 방법 :

  • tableView에서 터치 포인트 얻기

  • 그런 다음 지점에서 셀의 인덱스 경로를 가져옵니다.

  • 색인 경로에 행 색인이 있습니다.

코드는 다음과 같습니다.

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


답변

스위프트 3

참고 : 메타 가 그러한 편집에 대해 눈살을 찌푸리는 것을 제외하고는 위 의 수락 된 답변 에 실제로 가야합니다 .

@IBAction func doSomething(_ sender: UIButton) {
   let buttonPosition = sender.convert(CGPoint(), to: tableView)
   let index = tableView.indexPathForRow(at: buttonPosition)
}

두 가지 사소한 의견 :

  1. 기본 함수에는 변환이없는 송신자 유형이 Any로 있습니다.
  2. CGPointZero는 CGPoint ()로 대체 될 수 있습니다.