didSelectItemAtIndexPath not called with multiple collection views on same screen

Refresh

December 2018

Views

499 time

4

I have 2 collection views on the same screen, and I have the data source and delegate implemented for both in the same view controller. However, the delegate methods such as didSelectItemAtIndexPath is only called for one.

Other info:

  • Both collection views have a cell with an image.
  • AllowSelection and UserInteractionEnabled is set to true in both collection views
  • User interaction enabled on the images
  • Delegate and data source are set on the storyboard from both collection views to the view controller
  • Collection views are displayed properly

Both collection views have the same setup, yet only one delegate works. Would you have any clues what could be setting this up?

The collection views are inside a view that has a scroll view. Could this be somehow related?

EDIT 2:

Project with the same problem: https://github.com/iagomr/ProblemWithAutoLayout

EDIT 1:

Somehow this has to do with autolayout constraints, because if I pin the bottom collection view to the bottom of the screen instead of the bottom of other collection view, it starts working.

This is all due to the fact that I need to build a tall screen, and added everything into a view inside a scroll view 1000 points tall.

Code:

//MARK: - CollectionView Delegate
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

    println("Called")
}

//MARK: - CollectionView DataSource
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    if collectionView == thisCV {
        return 1

    } else if collectionView == thisOtherCV{
        return 1
    }
}

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    if collectionView == "thisCV" {
        if let thisCell = collectionView.dequeueReusableCellWithReuseIdentifier("thisCell", forIndexPath: indexPath) as? thisCollectionViewCell {

            thisCell.image = image

            return thisCell
        }

    } else if collectionView == "thisOtherCV"{
        if let thisOtherCell = collectionView.dequeueReusableCellWithReuseIdentifier("thisOtherCell", forIndexPath: indexPath) as? OtherCollectionViewCell {

            thisOtherCell.image = image

            return thisOtherCell
        }
    }

    return UICollectionViewCell()
}

1 answers

2

Я могу подтвердить , что didSelectItemне вызывался. Если константа для верха-низа ограничения между двумя видами сбора изменяются от 501 до 0 он работает.

Эта проблема, скорее всего, связано с тем, что у вас есть две точки зрения прокрутки (просмотр коллекции) внутри другого зрения прокрутки. В целом, я бы сказал, что вы должны изменить свой пользовательский интерфейс. Я хотел бы предложить два способа крепления его

Использование единого представления коллекции

Используйте только один вид коллекции с различными секциями для различного содержания. Кроме того, НЕ вставлять его в окне прокрутки - вид коллекции уже имеет вид прокрутки, так что вы должны быть в состоянии легко прокручивать. Вы также можете из очереди другого класса клеток для различных разделов, так что вы должны быть в состоянии сделать все, что вы хотите сделать сейчас.

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

Используя вид прокрутки

Если вы хотите настроить ваш пользовательский интерфейс в Interface Builder удалить обе точки зрения сбора и просто добавить все ваши UI внутри зрения прокрутки. Поместите UIButtonв тех местах , где вы хотите , нажав производить действия.

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