在tableview单元格中重叠文本-swift

时间:2018-03-08 12:38:44

标签: swift uitableview

我在UIView内创建的TableViewCell内容中有一些文字。当这些TableViewCell更新后,文本会重叠,几乎就像之前的文本一样,没有被删除,就像这样:在这里,我有两个不同的单元格,用于聊天屏幕。

有人能建议我解决方案吗?

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

   let message = fetchedResultController.object(at: indexPath) as? Message
    print(message?.userId)
        if message?.userId == myID{
            let cell = tableView.dequeueReusableCell(withIdentifier: "myChatCell", for: indexPath) as! MyChatTableViewCell
                 tableView.rowHeight = cell.setLabel(text: (message?.message)!) + 50.0
            return cell
        }
        else
        {
            let cell = tableView.dequeueReusableCell(withIdentifier: "chatCell", for: indexPath) as! ChatTableViewCell
               tableView.rowHeight = cell.setLabel(text: (message?.message)!) + 50.0               
            return cell
        }
}

// MychatTableviewcell类

class MyChatTableViewCell: UITableViewCell {

@IBOutlet weak var userImageView: UIImageView!
@IBOutlet weak var chatView: UIView!
var dynamicLabel: UILabel = UILabel()

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}


func setLabel(text : String) -> CGFloat
{
    let font = UIFont(name: "Verdana", size: 18)
    dynamicLabel = UILabel(frame: CGRect(x:0, y:0, width: chatView.bounds.width-10, height:CGFloat.greatestFiniteMagnitude))
    dynamicLabel.font = font
    dynamicLabel.numberOfLines = 0
    dynamicLabel.lineBreakMode = NSLineBreakMode.byWordWrapping
    dynamicLabel.text = "hai"
    print(text)
    print(dynamicLabel.text)
    dynamicLabel.sizeToFit()

    var detailHeight = dynamicLabel.frame.height
    chatView.addSubview(dynamicLabel)
    return detailHeight
}

//也是chattableview单元格的相同代码

1 个答案:

答案 0 :(得分:0)

当您使用UITableViewCell时,

UICollectionViewCell(和dequeueReusableCell(withIdentifier:for:))会被重复使用。您可以避免使用该方法并创建它们,但不建议这样做,根本不建议。

这意味着当他们离开屏幕时,他们被保存在“准备使用”的细胞池中。这是优化,以避免来自时间/资源消耗的xib或简单init的init。 它们在“池”中保留,并具有离开屏幕时的所有设置。

在您的情况下,这意味着他们已经有userImageViewchatViewdynamicLabel

因此,tableView(_ tableView:cellForRowAt:) cell.setLabel(text:) chatView.addSubview(dynamicLabel) var dynamicLabel: UILabel = UILabel() IBOutletaddSubview()每次都会添加视图。

解决方案:

为什么addSubView(dynamicLabel)不是awakeFromNib()?这可以避免你的麻烦。您不必执行awakeFromNib()

另一种可能性是init(style:reuseIdentifier:)只有一次override func awakeFromNib() { super.awakeFromNib() let font = UIFont(name: "Verdana", size: 18) dynamicLabel = UILabel(frame: CGRect(x:0, y:0, width: chatView.bounds.width-10, height:CGFloat.greatestFiniteMagnitude)) dynamicLabel.font = font dynamicLabel.numberOfLines = 0 dynamicLabel.lineBreakMode = NSLineBreakMode.byWordWrapping chatView.addSubview(dynamicLabel) } func setLabel(text : String) -> CGFloat { dynamicLabel.text = text dynamicLabel.sizeToFit() var detailHeight = dynamicLabel.frame.height return detailHeight } 。这是通过代码完成单元格设置时通常所做的事情,而不仅仅是Xibs(好吧,如果它只是通过代码,dynamicLabel将不会被调用,它应该被放入{ {1}})。

func prepareForReuse() {
    super.prepareForReuse()
    dynamicLabel.removeFromSuperview();
}

其他解决方案,但每次都会创建过度工作的Redirects to external URLs are not allowed by default, use \Drupal\Core\Routing\TrustedRedirectResponse for it. (因为您添加了子视图,然后将其删除)。

$settings['trusted_host_patterns'] = array(
'^myurl\.com$',