我在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单元格的相同代码
答案 0 :(得分:0)
UITableViewCell
时, UICollectionViewCell
(和dequeueReusableCell(withIdentifier:for:)
)会被重复使用。您可以避免使用该方法并创建它们,但不建议这样做,根本不建议。
这意味着当他们离开屏幕时,他们被保存在“准备使用”的细胞池中。这是优化,以避免来自时间/资源消耗的xib或简单init的init。 它们在“池”中保留,并具有离开屏幕时的所有设置。
在您的情况下,这意味着他们已经有userImageView
,chatView
和dynamicLabel
。
因此,tableView(_ tableView:cellForRowAt:)
cell.setLabel(text:)
chatView.addSubview(dynamicLabel)
var dynamicLabel: UILabel = UILabel()
IBOutlet
,addSubview()
每次都会添加视图。
解决方案:
为什么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$',