表格单元格中的文本重叠SWIFT

时间:2015-07-09 14:11:43

标签: swift uitableview parse-platform

我有一些文本进入我在表格视图单元格中创建的UIlabels。当这些表格视图单元格被更新时,文本会重叠,几乎就像之前的文本一样,文本没有被删除,如下所示:

enter image description here

代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

 let cell = tableView.dequeueReusableCellWithIdentifier("Cell",forIndexPath: indexPath) as! UITableViewCell

    var nameLabel = UILabel(frame: CGRectMake(cell.frame.size.width * 0.040, cell.frame.size.height * 0.22, cell.frame.size.width * 0.735, cell.frame.size.height * 0.312))

    var userAtIndexPath = finalMatchesBlurUser[indexPath.row]

    nameLabel.text = userAtIndexPath.username.uppercaseString

    cell.addSubview(nameLabel)
}

finalMatchesBlurUser是从Parses数据库获取的PFUser,当这种变化导致名称重叠时,它将发生变化。

任何人都可以指出为什么会这样吗?

2 个答案:

答案 0 :(得分:4)

每次更新tableview时,它都会检查队列以查看它是否可以重用一个单元而不是初始化一个单元。在这种情况下,当它更新时,它在队列中有单元格,因此每次表更新时都会添加一个新的标签子视图,这会导致此效果。在这种情况下,您应该只添加标签子视图(如果它尚不存在)。否则,只需更新该子视图的文本。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

     let cell = tableView.dequeueReusableCellWithIdentifier("Cell",forIndexPath: indexPath) as! UITableViewCell

         if let nameLabel = cell.viewWithTag(100) as? UILabel{

              var userAtIndexPath = finalMatchesBlurUser[indexPath.row]

              nameLabel.text = userAtIndexPath.username.uppercaseString
         }
         else{
               nameLabel = UILabel(frame: CGRectMake(cell.frame.size.width * 0.040, cell.frame.size.height * 0.22, cell.frame.size.width * 0.735, cell.frame.size.height * 0.312))

               nameLabel.tag = 100;

               var userAtIndexPath = finalMatchesBlurUser[indexPath.row]

               nameLabel.text = userAtIndexPath.username.uppercaseString

               cell.addSubview(nameLabel)
         }
     return cell;
     }

答案 1 :(得分:2)

每次即使重复使用单元格,也会创建UILabel。 解决方案是在Interface Builder中创建UILabel并分配标签(例如100)。

然后使用此代码

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell",forIndexPath: indexPath) as! UITableViewCell
    let nameLabel = cell.viewWithTag(100) as! UILabel
    let userAtIndexPath = finalMatchesBlurUser[indexPath.row]
    nameLabel.text = userAtIndexPath.username.uppercaseString
}