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

У меня есть UITableView, в котором есть несколько пользовательских ячеек. В пользовательских ячейках у меня есть основной UIImageView. Когда ячейка создана, я добавляю распознаватель жестов касания в представление изображения.

Когда изображение нажато, я запускаю следующее:

- (void) handleImageTap:(UIGestureRecognizer *)gestureRecognizer {
    NSLog(@"Image tapped");
    UIImageView *imageView = (UIImageView *)gestureRecognizer.view;
    // send the image instead of self when firing the segue
    [self performSegueWithIdentifier:@"remindMeTurnInfo" sender:imageView];
}

Затем я передаю изображение в новый контроллер представления в методе prepareForSegue:

if ([segue.identifier isEqualToString:@"remindMeTurnInfo"]) {
        UIImageView *imgView = (UIImageView *)sender;
        MESPlayedTurnReminderViewController *VC = segue.destinationViewController;
        VC.turnImage = imgView.image;
    }

Вопрос
1. Мне нужна ссылка на ячейку, в которой находится UIImageView, которая была нажата. Таким образом, пользователь касается одного из изображений ячеек, и мне нужно знать, из какой ячейки (indexPath) было получено это изображение.

2. Я обнаружил, что иногда при нажатии на изображение вызывается didSelectRowAtIndexPath. Это неправильно, и его не следует вызывать, только соответствующий метод handleTap из Gesture Rec. следует назвать. Как я могу гарантировать, что didSelectRowAtIndexPath не вызывается, так как мне нужно запустить какой-то другой код, когда ячейка действительно (правильно) выбрана.


person StuartM    schedule 18.10.2013    source источник


Ответы (2)


Обычно это делается двумя способами. Либо добавьте тег к представлению изображения в cellForRowAtIndexPath, который равен indexPath.row, либо выполните поиск по иерархии представлений из представления изображения, пока не найдете тот, который является UITableViewCell (или подклассом). Это можно сделать так:

- (void) handleImageTap:(UIGestureRecognizer *)gestureRecognizer {
    UIImageView *imageView = (UIImageView *)gestureRecognizer.view;
    UIView *superview = imageView.superview;
    while (![superview isKindOfClass:[UITableViewCell class]]) {
        superview = superview.superview;
    }
    NSLog(@"indexPath.row is: %d", [self.tableView indexPathForCell:(UITableViewCell *)superview].row);
} 

Причина поиска вместо использования чего-то вроде imageView.superview.superview (что будет работать в iOS 6) заключается в том, что иерархия может меняться в разных версиях iOS, и фактически она менялась между iOS 6 и iOS 7.

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

person rdelmar    schedule 19.10.2013
comment
Спасибо за этот подход. Это здорово, но как мне тогда передать indexPath в метод prepareForSegue. В настоящее время я передаю imageView в качестве отправителя для метода, чтобы я мог ссылаться на изображение (по вопросу), но как мне передать indexPath, поскольку мне действительно нужно это в методе prepareForSegue вместо этого. - person StuartM; 19.10.2013
comment
Я смог воспроизвести описанное выше в методе prepareForSegue без каких-либо проблем, и это здорово. Спасибо за вашу помощь. - person StuartM; 19.10.2013

1.- Чтобы получить ячейку, вы можете проверить супервизию UIImageView.

- (void) handleImageTap:(UIGestureRecognizer *)gestureRecognizer
{    
    UIImageView *imageView = (UIImageView *)gestureRecognizer.view;
    UITableViewCell *cell = (UITableViewCell *)imageView.superview;
}

2.- Чтобы отключить выбор ячейки в UITableView

[self.yourTableView setAllowsSelection:NO];
person JeroValli    schedule 18.10.2013