【问题标题】:Strange bug on dequeuing collectionviewcell出队collectionviewcell的奇怪错误
【发布时间】:2017-05-16 10:53:29
【问题描述】:

我有一个由collectionView 组成的calendarView。它是使用数学计算得出的自定义calendarView 第七行标记星期六和假期,所以第七列所有标签的字体颜色为红色。 但是,当我滑动或导航到其他日子时,红色标签以随机顺序分散,无法追踪。截图如下:

这是怎么发生的? 在我的dequeueReusableCell 方法中,我将单元格配置为:

cell.isHoliday = (indexPath.row + 1) % 7 == 0 ? true : false

这就是我自定义的collectionViewCell 中的假期逻辑。

@IBOutlet var dateLabel: UILabel!
@IBOutlet var englishDateLabel: UILabel!
@IBOutlet var tithiLabel: UILabel!

var isToday: Bool = false {
    didSet {
        self.contentView.backgroundColor = isToday ? Colors.Palette.LightGreen : UIColor.white
    }
}

var isHoliday: Bool = false {
    didSet {
        if isHoliday {
            tithiLabel.textColor = Colors.Palette.DarkRed
            dateLabel.textColor = Colors.Palette.DarkRed
            englishDateLabel.textColor = Colors.Palette.DarkRed
        }
        else {
            dateLabel.textColor = UIColor.black
            englishDateLabel.textColor = UIColor.black
        }
    }
}

当我滑动到下个月时,每个 collectionview 单元格顶部的红色标签数量继续增加。为什么会发生这种情况,我该如何阻止这种情况发生?

【问题讨论】:

  • 发生因为单元格在出队后被重用,使用prepareForReuese清除旧值。

标签: ios swift3 uicollectionview uicollectionviewcell


【解决方案1】:

您缺少其他部分:

var isHoliday: Bool = false {
    didSet {
        if isHoliday {
            tithiLabel.textColor = Colors.Palette.DarkRed
            dateLabel.textColor = Colors.Palette.DarkRed
            englishDateLabel.textColor = Colors.Palette.DarkRed
        }
        else {
            tithiLabel.textColor = UIColor.black
            dateLabel.textColor = UIColor.black
            englishDateLabel.textColor = UIColor.black
        }
    }
}

【讨论】:

    【解决方案2】:

    这可能是因为单元格正在被重用,并且您没有在自定义单元格类的 prepareForReuse 方法中实现任何逻辑。在此方法中尝试将文本颜色属性设置为 nil。

    【讨论】:

      【解决方案3】:

      处理重用单元格中显示的旧数据的正确方法是在您的自定义单元格中覆盖prepeareForReuse

      open override func prepareForReuse() {
          super.prepareForReuse()
      
           tithiLabel.textColor = UIColor.black
           dateLabel.textColor = UIColor.black
           englishDateLabel.textColor = UIColor.black
      }
      

      清除旧值(通过将它们分配给nil)或将默认值设置为在重用单元格后可能不一定要设置的所有值。这样,即使新值没有显式设置到单元格,您也可以确定旧值不会被保留。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2017-07-25
        • 2017-11-11
        相关资源
        最近更新 更多