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

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

внутриUITableViewControllerЯ установил изображение и текст в табличном представленииcellForRowAtIndexPath.

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

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

Ответы на вопрос(5)

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

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

 18 июн. 2012 г., 10:29
Но как бы то ни было, это не справляется со скачками, если это то, что вы ищете ...

очень абстрактный и общий ответ заключается в следующем Для каждого добавляемого 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
    }
}
Решение Вопроса

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

Сначала убедитесь, что ваш контроллер принимает протокол 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
        }
    }
}
 13 апр. 2016 г., 09:02
Для тех, кто не знает. ВсеUITapGestureRecognizer настроить вviewDidLoad также может быть сделано в макете пользовательского интерфейса Xcode (он же IB). Вы хотите изменить тип возвратаhandleTap: вIBAction.

Вы могли бы подкласс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, зависит от того, какой функциональности вы хотите достичь.

у вас есть два варианта для реализации: - 1 - добавьте UITapGestureRecognizer в ваш "uitableviewcell" и сделать это указать на изображение и передайте «путь-индекса» в качестве параметра для селектора и заставить делегата передать его в 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]; но я предпочитаю первый путь

Ваш ответ на вопрос