当重用单元格时,UICollectionViewCell的文本出现在其他地方

时间:2016-08-04 00:43:07

标签: ios swift uicollectionview uicollectionviewcell

我正在使用swift制作时间表应用。 我从网站加载我的数据并将其放在collectionView上。 在第一部分,我把星期几放在第一行,我把类放在其他单元格中,我把数据放在网上(主题名称,课堂......) 如果我进入时间表视图,一切都很好。 但是,如果我向下滚动并向上滚动,则会打印一些不应该出现的文本。

First time when I enter the timetable view

After I scroll down and up

这是我的collectionView(collectionView: , cellForItemAtIndexPath: )

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    print("\(indexPath.section), \(indexPath.row)")
    let dayArray = ["", "월", "화", "수", "목", "금"]
    if indexPath.section == 0 {
        // Day
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as UICollectionViewCell
        var titleLabel = UILabel(frame: CGRectMake(0, 0, cell.bounds.width, cell.bounds.height))
        cell.contentView.addSubview(titleLabel)
        titleLabel.text = dayArray[indexPath.row]
        titleLabel.textAlignment = NSTextAlignment.Center
        cell.backgroundColor = mainColor
        print("day")
        return cell
    }
    if indexPath.row == 0 {
        // index
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as UICollectionViewCell
        var titleLabel = UILabel(frame: CGRectMake(0, 0, cell.bounds.width, cell.bounds.height))
        cell.contentView.addSubview(titleLabel)
        titleLabel.text = String(indexPath.section)
        titleLabel.textAlignment = NSTextAlignment.Center
        cell.backgroundColor = mainColor
        print("time")
        return cell
    }
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! TimeTableCell
    if let timeTableElement = self.timeTable[indexPath.section-1][indexPath.row-1] {
        cell.subjectNameLabel.text = timeTableElement.subjectName
        cell.subjectNameLabel.adjustsFontSizeToFitWidth = true
        cell.classRoomLabel.text = timeTableElement.classRoom
        cell.classRoomLabel.adjustsFontSizeToFitWidth = true
    } else {
        cell.subjectNameLabel.text = ""
        cell.classRoomLabel.text = ""
    }
    cell.backgroundColor = mainColor
    print("class")
    return cell
}

我使用默认UICollectionViewCell添加标签子视图以显示日期和课程时间,并使用自定义TimeTableCell来显示班级数据。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

尝试为TimeTableCell使用不同的“reuseIdentifier”:

  1. 在属性检查器中更改重用标识符: enter image description here
  2. 更改您的代码:

     let cell = collectionView.dequeueReusableCellWithReuseIdentifier(yourReuseIdentifier, forIndexPath: indexPath) as! TimeTableCell
    
  3. PS。我建议首先删除现有的titleLabel,然后添加新的titleLabel,否则在向下滚动时会再次添加。

    修改

    您可以通过两种方式'删除'titleLabel:

    1. 添加自定义单元格以及TimeTableCell(不同的名称和不同的ReuseIdentifier)。如您所见,TimeTableCell中的subjectNameLabel将不会一次又一次地添加。

    2. 初始化后为titleLabel设置标记,并根据标记将其删除。

      let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as UICollectionViewCell
      cell.contentView.viewWithTag(999)!.removeFromSuperview()
      var titleLabel = UILabel(frame: CGRectMake(0, 0, cell.bounds.width, cell.bounds.height))
      titleLabel.tag = 999
      cell.contentView.addSubview(titleLabel)
      titleLabel.text = dayArray[indexPath.row]
      titleLabel.textAlignment = NSTextAlignment.Center
      cell.backgroundColor = mainColor
      print("day")
      return cell
      

答案 1 :(得分:0)

在添加标题标签之前,您需要删除标题标签

 let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as UICollectionViewCell
     // Here find view with tag 999 and remove it from superview 
    var titleLabel = UILabel(frame: CGRectMake(0, 0, cell.bounds.width, cell.bounds.height))
    cell.contentView.addSubview(titleLabel)
    titleLabel.tag = 999;
    titleLabel.text = String(indexPath.section)
    titleLabel.textAlignment = NSTextAlignment.Center
    cell.backgroundColor = mainColor
    print("time")
    return cell