Неожиданное поведение ячейки CollectionView - PullRequest
0 голосов
/ 10 февраля 2019

Мои ячейки создаются на основе timeSlotArray, в котором хранятся все временные интервалы времени открытия с шагом 30 минут, но их цвет зависит от того, равен ли их идентификатор любому из идентификаторов записей bookedTimeSlotsArray.Если я выберу день, у которого есть заказы, он получит правильный цвет ячеек, но ячейки сохранят этот цвет при перезагрузке данных, даже если я перейду на дату с другими бронированиями.

Функция:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "timeSlotCell", for: indexPath) as! TimeSlotCollectionViewCell

    // Configure the cell
    cell.timeLabel.text = timeSlotArray[indexPath.row]

    cell.cellId = Int("\(String(describing: self.selectedDate))" + self.timeStringToStringConvert(timeSlotArray[indexPath.row]))

    if bookedTimeSlotsArray.count > 0 {
        for index in 0...bookedTimeSlotsArray.count - 1 {
            let bookingId = bookedTimeSlotsArray[index].bookingId

            if cell.cellId == bookingId {
                print("   match found")
                print("Index is: \(index)")
                print("cell time is: \(timeSlotArray[indexPath.row])")
                print("time slot cell id is: \(String(describing: cell.cellId))")
                print("booking id: \(bookingId)")
                cell.backgroundColor = UIColor.red.withAlphaComponent(0.3)
            } else {
                cell.backgroundColor = UIColor.green.withAlphaComponent(0.8)

            }
        }
    }
    return cell
}

Я перезагружаю данные представления коллекции в 2 функциях, calculateOpenTimeSlots() и calculateBookedTimeSlots(), и они вызываются так: 1-й случай: в viewDidLoad() Я вызываю обе функции, 2-й случай: в Firebase наблюдательФункция, которую я вызываю только calculateBookedTimeSlots(), 3-й случай: при смене дня из выбора ячейки табличного представления я вызываю только calculateOpenTimeSlots() в didSelectRowAt.1-й и 3-й случаи работают, как и ожидалось, но 2-й не так, как описано в начале вопроса.Ребята, вы можете увидеть, где я бью стенуБольшое спасибо, как обычно.

РЕДАКТИРОВАТЬ:

Я добавил prepareForReuse в класс своей ячейки, но я все еще получаю то же поведение, когда представление коллекции рисует ячейки.Вот класс клеток:

import UIKit

class TimeSlotCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var timeLabel: UILabel!

    var cellId: Int!

    override func prepareForReuse() {
        super.prepareForReuse()
        // Set your default background color, title color etc
        backgroundColor = UIColor.green.withAlphaComponent(0.8)
    }

}

1 Ответ

0 голосов
/ 10 февраля 2019

Нашел проблему.Я отменил оператор else после оператора if в cellForItemAt, поскольку теперь prepareForReuse устанавливает ячейку по умолчанию.Теперь все работает как положено.Последняя функция:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "timeSlotCell", for: indexPath) as! TimeSlotCollectionViewCell

        // Configure the cell
        cell.timeLabel.text = timeSlotArray[indexPath.row]

        cell.cellId = Int("\(String(describing: self.selectedDate))" + self.timeStringToStringConvert(timeSlotArray[indexPath.row]))

        if bookedTimeSlotsArray.count > 0 {
            for index in 0...bookedTimeSlotsArray.count - 1 {
                let bookingId = bookedTimeSlotsArray[index].bookingId

                if cell.cellId == bookingId {
                    print("   match found")
                    print("Index is: \(index)")
                    print("cell time is: \(timeSlotArray[indexPath.row])")
                    print("time slot cell id is: \(String(describing: cell.cellId))")
                    print("booking id: \(bookingId)")
                    cell.backgroundColor = UIColor.red.withAlphaComponent(0.3)
                }
            }
        }
        return cell
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...