Перекрывающееся значение метки с collectionView.reloadItems [at: [indexPath]] - PullRequest
0 голосов
/ 24 октября 2018

У меня есть CollectionView с ячейкой прототипа.В ячейке есть метка.Ярлык меняет значение с течением времени очень часто.Я перезагружаю данные с collectionView.reloadItems[at: [indexPath]], моя проблема в том, что когда я использую этот метод, обновляя метки в представлении коллекции, когда метка обновляет свое значение, я на мгновение перекрываю значения: Как на картинке:

Overlapping value while for a blink of an eye

Когда я использую метод collectionView.reloadData() У меня нет этой проблемы.Но для обновления представления коллекции требуется гораздо больше ресурсов процессора и времени.

Еще код: Здесь я собираю новые данные ячейки и отправляю их в свою функцию updateCell:

let btesMeter:[UInt8] = [data![7], data![6], data![5], data![4]]
                let resultMeter = (UInt32(btesMeter[3]) << 24) + (UInt32(btesMeter[2]) << 16) + (UInt32(btesMeter[1]) << 8) + UInt32(btesMeter[0])
                let tempresultMeter = resultMeter / 1000
                updateCell(cellname: "Kilometerstand", newValue: String(tempresultMeter))

Это моя функция UpdateCel:

  func updateCell(cellname: String, newValue: String) {
    let cell = cellname
    if let cellname = periodicData.first(where: {$0.title == cell}) {
        if cellname.value == newValue {
            return
        } else {
            cellname.value = newValue
            if let indexOf = periodicData.firstIndex(where: {$0.title == cell}) {
                // Reload the index
                let indexPath = IndexPath(item: indexOf, section: 0)
                let array:[IndexPath] = [indexPath]
                collectionView.reloadItems(at: array)
            }
        }
    }
}

cellForItemAt:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCollectionViewCell
    cell.labelTitle.text = periodicData[indexPath.row].title

    cell.labelValue.text = periodicData[indexPath.row].value
    return cell
}

CustomCollectionViewCell:

class CustomCollectionViewCell: UICollectionViewCell {


@IBOutlet weak var labelTitle: UILabel!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var labelValue: UILabel!

}

1 Ответ

0 голосов
/ 24 октября 2018

У меня недостаточно информации о вашем коде, но эта проблема может быть исправлена ​​

prepareForReuse()

.

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

Переопределите эту функцию в своем пользовательском классе ячеек и очистите любой UILabel. Эта функция будет срабатывать при каждой перезагрузке или снятии очереди с ячейки.

пример того, что вы собираетесь делать.

override func prepareForReuse() {
    super.prepareForReuse()
    label.text = "" // cleans up the text inside the label to reuse again 
} 

ОБНОВЛЕНИЕ : если вышеприведенное не сработало,

вам, вероятно, необходимо очистить источник данных перед вызовом reloadData.

Причина, по которой вы получаете этот эффект, состоит в том, что источник, который вы используете для определения количества элементов и разделов в представлении коллекции, все еще содержит старые данные.

Простой способубедитесь, что это NSLog содержимое источника данных непосредственно перед вызовом reloadData.

OP

Надеюсь, это поможет!

...