developer tip

버튼을 누를 때 UITableView 셀 행 가져 오기

copycodes 2020. 9. 17. 08:01
반응형

버튼을 누를 때 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. If you create a custom UITableViewCell (your own subclass), then you can simply call self in the IBAction. You can link the IBAction function to your button by using storyboard or programmatically when you set up the cell.

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

I assume you add buttons to cell in cellForRowAtIndexPath, then what I would do is to create a custom class subclass UIButton, add a tag called rowNumber, and append that data while you adding button to cell.


Another simple way:

  • Get the point of touch in tableView

  • Then get index path of cell at point

  • The index path contains row index

The code is:

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

Swift 3

Note: This should really go in the accepted answer above, except that meta frowns upon such edits.

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

Two minor comments:

  1. The default function has sender type as Any, which doesn't have convert.
  2. CGPointZero can be replaced by CGPoint()

One solution could be to check the tag of the button's superview or even higher in the view hierarchy (if the button is in the cell's content view).


I would like to share code in 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
    }
}

In swift:

@IBAction func buttonAction(_ sender: UIButton) {
    guard let indexPath = tableView.indexPathForRow(at: sender.convert(CGPoint(), to: tableView)) else {
        return
    }
    // do something
}

참고URL : https://stackoverflow.com/questions/7504421/getting-row-of-uitableview-cell-on-button-press

반응형