it-roy-ru.com

UICollectionView только вызывает didSelectItemAtIndexPath, если пользователь дважды нажимает, не будет вызывать, когда пользователь нажимает одну кнопку

У меня есть UICollectionView, который о размере экрана. UICollectionViewCells, которые он отображает, имеют тот же размер, что и collectionView. Каждая ячейка имеет UIImage, который является размером ячейки. В CollectionView включена функция подкачки страниц, поэтому по сути это полноэкранное слайд-шоу с фотографиями, которое пользователь может пролистать. 

Проблема в том, что
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath вызывается только в том случае, если пользователь касается двумя пальцами ячейки или долго нажимает одним пальцем, а затем отпускает. Кажется, он не имеет поведения по умолчанию для выбора одним нажатием. Я не внес никаких изменений в распознаватель жестов CollectionView, поэтому у меня возникли проблемы с поиском решения этой проблемы. 

47
Kris Gellci

Вы уверены, что не случайно переопределили функцию - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath? «Выбрать» против «отменить выбор» споткнуло меня в прошлом из-за завершения кода Xcode.

198
Owen Mathews

У меня была просто та же проблема, и оказалось, что в UITapGestureRecognizer есть UIView, содержащая UICollectionView, и он отвечает вместо этого.

Это объясняет, почему didSelectItemAtIndexPath работает, только если пользователь нажимает двумя пальцами или долго нажимает одним пальцем, потому что это не вызывает UITapGestureRecognizer.

Итак, проверьте все UITapGestureRecognizer, которые вы получили, не обязательно непосредственно на UICollectionView, но это может быть на любом UIView, содержащем его.

119
iDifferent

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

Вы захотите отключить взаимодействие с пользователем в представлении препятствий либо в NIB, либо в коде.

view.userInteractionEnabled = NO;

13
Oliver Atkinson

Просто добавьте к уже решенному вопросу еще одну ситуацию, когда жест касания может не сработать, так как это продолжало мучить меня.

Если вы вернете false в UICollectionViewDelegate's collectionView:shouldHighlightItemAtIndexPath:, жест касания не будет работать, и collectionView:didSelectItemAtIndexPath: не будет вызван. По умолчанию возвращаемое значение этого метода делегата - true, поэтому у вас не возникнет проблемы, если вы не реализуете ее намеренно. 

7
Blaszard

Я просто столкнулся с этой проблемой сам. Первоначально у меня были кнопки и метки, затем я реорганизовал свой интерфейс и превратил эти кнопки/метки в ячейки для переменной UICollectionView.

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

Глупо и очевидно в ретроспективе, но мне потребовалось несколько часов, чтобы понять, что я сделал.

3
DBD

Если вы используете только didselect:

self.collectionView.allowsMultipleSelection = false

Или удалите эту строку.

2
Sour LeangChhean

У меня была такая же проблема ... Я переопределял touchSegan в представлении CollectionCell, и это приводило к тому, что didSelectItemAtIndexPath не срабатывал при касании ячейки. Убрал переопределение и все заработало.

2
digthewells

Я столкнулся с этой проблемой в Swift 3 и xcode 8, у меня было представление и представление коллекции внутри этого. Представление коллекции имеет userInteractionEnabled, равное true, все еще не работало. Исправлена ​​эта проблема путем переопределения shouldHighlightItemAt, у меня нет никаких дополнительных/Пользовательская реализация в этом методе, поэтому я не переопределил этот метод. После добавления приведенного ниже кода вызывается метод didSelectItem. 

func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
        return true
    }
1
Vinodha Sundaramoorthy

Я случайно наткнулся на эту проблему, и это расстроило меня один долгий день, пока я не нашел это Вам просто нужно снять флажок "Взаимодействие с пользователем включено" , Когда я выбрал ячейку в левом верхнем углу внутри CollectionView в раскадровке. и проблема решена

1
Phan Hoang

Я столкнулся с подобной проблемой, и виновником в моем случае оказался CardView , который я использовал в иерархии UICollectionView Cell. Как только я отключил взаимодействие с пользователем для CardView, collectionView начал реагировать на сенсорные события.

1
Love Kumar

В моем случае это было просто 

self.collectionView.allowsSelection  =NO;

Я имел в коде.

меняется на 

self.collectionView.allowsSelection  =YES;

почини это.

0
user1105951

Попробуйте удалить все ваши UIGestures из представления, а затем проверьте, можно ли нормально взаимодействовать с ячейками UICollectionView.

В моем случае мне пришлось удалить строки: 

let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    self.view.addGestureRecognizer(tap)
0
drfalcoew

В случае, если это поможет, это просто глупо укусит меня, потратив пару часов. Дважды проверьте, является ли ваша пользовательская ячейка подклассом UICollectionViewCell вместо, скажем, UICollectionReusableView ????

0
nandodelauni