Как да получите препратката към клетката от жест на друг елемент в клетката

Имам UITableView, който има някои персонализирани клетки. В персонализираните клетки имам основен UIImageView. Когато клетката е създадена, добавям Tap Gesture Recogniser към изгледа на изображението.

Когато изображението бъде докоснато, изпълнявам следното:

- (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 в метода pripraveForSegue. Понастоящем предавам imageView като подател на метода, така че да мога да се свържа с изображението (според въпроса), но как да предам indexPath, тъй като всъщност имам нужда от това в метода подготвитеForSegue вместо това. - person StuartM; 19.10.2013
comment
Успях да репликирам горното в метода pripraveForSegue без никакви проблеми, което е страхотно. Благодаря за вашата помощ. - 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