Как я могу различить, какая часть UITableViewCell была нажата

Я создал UITableView с пользовательским UITableViewCell. Моя ячейка включает в себя один UIImageView слева и UITextView справа.

Внутри UITableViewController я устанавливаю оба изображения и текст в tableview cellForRowAtIndexPath.

Все отлично, но теперь мне нужно реализовать didSelectRowAtIndex, и мне нужно отличить, было ли нажато UIImageView или UITextView ячейки.

Скажем, щелчок изображения представляет собой действие удаления и остальную часть действия редактирования ячейки.

Ответы

Ответ 1

Вместо добавления распознавателей жестов в каждую отдельную ячейку вы можете добавить ее в представление таблицы и определить, какая ячейка была выбрана с точки касания пользователей, а затем определить, коснулся ли пользователь изображения или ячейки.

Сначала убедитесь, что ваш контроллер использует протокол UIGestureRecognizerDelegate.

@interface MyTableViewController() <UIGestureRecognizerDelegate>
@end

Затем добавьте UIGestureRecognizer к UITableView при загрузке представления.

    - (void)viewDidLoad
{
    [super viewDidLoad];
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    singleTap.delegate = self;
    singleTap.numberOfTapsRequired = 1;
    singleTap.numberOfTouchesRequired = 1;
    [self.tableView addGestureRecognizer:singleTap];
}

Этот метод делегата определяет, должен ли выполняться метод handleTap:. Если он может найти indexPath от пользователя, то он возвращает YES, иначе он возвращает NO.

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    UITableView *tableView = (UITableView *)gestureRecognizer.view;
    CGPoint p = [gestureRecognizer locationInView:gestureRecognizer.view];
    if ([tableView indexPathForRowAtPoint:p]) {
        return YES;
    }
    return NO;
}

Как только мы определили, щелкнули ли пользователи в ячейке, вызывается метод handleTap:, который затем решает, коснулся ли пользователь изображения или какая-либо другая часть ячейки.

- (void)handleTap:(UITapGestureRecognizer *)tap
{
    if (UIGestureRecognizerStateEnded == tap.state) {
        UITableView *tableView = (UITableView *)tap.view;
        CGPoint p = [tap locationInView:tap.view];
        NSIndexPath* indexPath = [tableView indexPathForRowAtPoint:p];
        [tableView deselectRowAtIndexPath:indexPath animated:NO];
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        CGPoint pointInCell = [tap locationInView:cell];
        if (CGRectContainsPoint(cell.imageView.frame, pointInCell)) {
            // user tapped image
        } else {
            // user tapped cell
        }
    }
}

Ответ 2

Вы можете подклассом UITableViewCell и переопределить touchesEnded.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    [super touchesEnded:touches withEvent:event];

    UITouch *touch = [touches  anyObject];
    CGPoint location = [touch locationInView:self];

    UIView *hitView = [self hitTest:location withEvent:event];

    if (hitView == myImageView) ...;
    if (hitView == myTextView) ...;
}

Вам нужно оставить ссылку на UIImageView и UITextView (они должны, вероятно, быть свойствами вашей ячейки).

Вы можете, конечно, переопределить touchesBegan вместо touchesEnded, зависит от того, какую функциональность вы хотите достичь.

Ответ 3

очень абстрактный и общий ответ заключается в следующем: Для каждого UIImage и UILabel вы добавляете свой тег как indexPath.row

//When creating the label and image add a recognizer to them
label.tag = indexPath.row;
imageView.tag = indexPath.row;

Затем добавьте UITapGestureRecognizer на каждое изображение и ярлык, например

    UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                                                                                 action:@selector(handleTap:)];
    [label addGestureRecognizer:recognizer];
    [imageView addGestureRecognizer:recognizer];
}

- (void) handleTap:(UITapGestureRecognizer*)recognizer
{
    UIView *view = recognizer.view;
    int row = view.tag;
    if ([view isKindOfClass:[UILabel class]]) {
        //Row is row
        //and the label is pressed
    }

    if ([view isKindOfClass:[UIImageView class]]) {
        //Row is row
        //and the imageview is pressed
    }
}

Ответ 4

Сделайте изображение UIButton. Когда действие кнопки запускается, вы знаете, что пользователь постучал по изображению (ячейка НЕ ​​будет выбрана). Если выбрана ячейка, вы знаете, что пользователь прослушивал где-то еще в строке (включая текстовое представление или метку).

Также установите свойство тега кнопки, например, индекс строки ячейки, чтобы вы могли узнать, какое изображение строки было нажато.

Ответ 5

у вас есть два варианта: 1 - добавьте UITapGestureRecognizer в свой "uitableviewcell" и сделайте его точкой зрения на изображение и передать "indexpath" в качестве параметра для селектора и сделать делегат передать его в tableviewcell

UILabel *label = =[UILabel alloc]init];
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
[[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTap)]     autorelease];
[label addGestureRecognizer:tapGesture];


-(void)labelTap{
[delegate [email protected](labeltapped:)withobject:indexpath];
}

2- Второй способ - проверить отправителя DidSelectRowAtIndexPath типа [imageview или label]; но я предпочитаю первый путь