Swift CollectionView получить первую ячейку - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь с помощью моего viewDidLoad () извлечь изображения из моей БД, а затем представить изображения и выделить первое.

Пока мой код:

                profile?.fetchImages(onComplete: { (errors, images) in
                    for error in errors {
                        print("Error", error)
                    }
                    for imageMap in images {
                        self.photos.append(imageMap.value)
                    }
                    if self.photos.count < self.MAX_PHOTOS {
                        self.photos.append(self.EMPTY_IMAGE)
                    }
                    DispatchQueue.main.async {
                        self.photoCollectionView.reloadData()
                    }
                    self.updateSlideshowImages()
                    let indexPath = IndexPath(row: 0, section: 0)
                    let cell = self.photoCollectionView.cellForItem(at: indexPath)
                    if cell != nil {
                        self.setBorder(cell!)
                    }
                })

Однако для меня ячейка всегда равна нулю, несмотря на существующие и извлекаемые изображения, и поэтому setBorder никогда не вызывается.Почему клетка всегда равна нулю?Я просто хочу установить границу для первой ячейки.

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Установите границу своей ячейки методом cellForRow.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellIdentifier", for: indexPath) as! YourCustomCell

    if indexPath.row == 0 {
         self.setBorder(cell)
    }

    return cell
}
0 голосов
/ 18 мая 2018

Вместо выделения UICollectionViewCell в viewDidLoad() после получения ответа выделите его методом willDisplay delegate, т.е.

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath)
{
    if indexPath.row == 0
    {
        cell.isHighlighted = true
    }
}

И добавьте границу ячейки в isHighlighted свойство UICollectionViewCell в соответствии с состоянием выделения ячейки, то есть

class CustomCell: UICollectionViewCell
{
    override var isHighlighted: Bool{
        didSet{
            self.layer.borderWidth = self.isHighlighted ? 2.0 : 0.0
        }
    }
}

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

Дайте мне знать, если у вас все еще есть проблемы.

0 голосов
/ 18 мая 2018

Вы поместили self.photoCollectionView.reloadData() в асинхронный блок, поэтому let cell = self.photoCollectionView.cellForItem(at: indexPath) будет запущен непосредственно перед перезагрузкой представления коллекции, поэтому вы получаете nil для первой ячейки.

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

В качестве альтернативы, вы можете сделать это в cellForItemAtIndexPath, как показано ниже ...

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CellIdentifier.jobCollectionViewCellIdentifier, for: indexPath) as! <#Your UICollectionViewCell#>

    if indexPath.section == 0 && indexPath.row == 0 {
          //highlight cell here
      }

    return cell
}

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

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

     let cell = ...

     if indexPath.row == arrImages.count-1 {

          let newIndexPath = IndexPath(row: 0, section: 0)
          if let cellImg = self.photoCollectionView.cellForItem(at: newIndexPath) {
              self.setBorder(cellImg)
          }
     }
}
...