0

Я установил UITapGestureRecognizer для UIScrollView внутри UICollectionView. Я настроил его для правильного обнаружения кранов и запуска метода, который я написал, но если я попытаюсь установить селектор в collectionView: didSelectItemAtIndexPath: программа вылетает, когда ячейка используется.iOS Почему метод collectionView: didSelectItemAtIndexPath: нельзя вызывать из UITapGestureRecognizer?

Любая идея, почему это так?

Это работает:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; 

- (void) tapped:(UIGestureRecognizer *)gesture{ 
//some code 
} 

Это не работает:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(collectionView:didSelectItemAtIndexPath:)]; 

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
//some code 
} 

ответ

5

код, который вы написали,

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(collectionView:didSelectItemAtIndexPath:)]; 

Селектор, как правило, просто Однофункциональный с один входной аргумент который является UITapGestureRecogniser объектом.

должен быть такой,

-(void)clicked:(UIGestureRecogniser *)ges{ 

} 

Но селектор вы использовали некорректным, поскольку требуется два входа, которые не могут быть поставлены с gestureRecogniser.Hence аварии.

Изменить код выше ниже одного,

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clicked:)]; 
-(void)clicked:(UIgestureRecogniser *)ges{ 
    //use gesture to get get the indexPath, using CGPoint (locationInView). 
    NSIndexPath *indexPath = ...; 
    [self collectionView:self.collectionView didSelectItemAtIndexPath:indexPath]; 

} 
1

Действие для жеста распознаватель должен соответствовать одному из следующих подписей:

- (void)handleGesture; 
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer; 

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

Смотрите документацию: https://developer.apple.com/library/ios/documentation/uikit/reference/UIGestureRecognizer_Class/Reference/Reference.html#//apple_ref/occ/instm/UIGestureRecognizer/initWithTarget:action:

0

Мы должны вызвать didSelectItemAtIndexPath от соответствующего эталонного объекта.

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; 

- (void) tapped:(UIGestureRecognizer *)gesture{ 

     NSIndexPath *indexPath = //create your custom index path here 

     [self.collectionViewObject didSelectItemAtIndexPath:indexPath]; 

} 
Смежные вопросы