У меня была такая же проблема, и другие ответы не работали для меня.Вот что я и сделал.
Я приложил жест, как предложил другой ответ.Затем я убедился, что вызван метод делегата для выбора.Я попытался просто выбрать ячейку, но это не сработало метод делегата.Я считаю, что только пользовательские взаимодействия вызывают метод делегата, поэтому этот код имитирует такое поведение.
https://gist.github.com/brennanMKE/e89bf7a28d96812d6a22
@implementation TappableTextView
- (instancetype)init {
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
[self setup];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
- (void)setup {
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapRecognized:)];
singleTap.numberOfTapsRequired = 1;
[self addGestureRecognizer:singleTap];
}
- (void)singleTapRecognized:(id)sender {
UIView *superview = self.superview;
UICollectionViewCell *cell = nil;
NSIndexPath *indexPath = nil;
while (superview) {
if ([superview isKindOfClass:[UICollectionViewCell class]]) {
cell = (UICollectionViewCell *)superview;
}
if ([superview isKindOfClass:[UICollectionView class]] && cell) {
UICollectionView *collectionView = (UICollectionView *)superview;
indexPath = [collectionView indexPathForCell:cell];
NSAssert(collectionView.delegate, @"Delegate must be defined");
NSAssert([collectionView.delegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)], @"Selection must be supported");
if (indexPath && [collectionView.delegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)]) {
[collectionView.delegate collectionView:collectionView didSelectItemAtIndexPath:indexPath];
}
return;
}
superview = superview.superview;
}
}
@end