Как я могу различить, какая часть 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];
но я предпочитаю первый путь