[英]Swift - tableViewCell issue when scrolling
I'm creating a chat app using swift. 我正在使用swift创建一个聊天应用程序。 On my storyboard, I have one View Controller that is responsible for showing the messages. 在故事板上,我有一个View Controller负责显示消息。 I have 3 swift files : 我有3个swift文件:
ChatingViewController : Class associated with the View Controller on the storyboard ChatingViewController:与情节提要上的View Controller关联的类
CustomChatingTableViewController CustomChatingTableViewController
CellChatingTableViewCell CellChatingTableViewCell
Each message is displayed in a cell. 每个消息都显示在一个单元格中。 I create the tableView programmatically. 我以编程方式创建tableView。
- ChatingViewController -ChatingViewController
import UIKit
class ChatingViewController: UIViewController {
var messageController = [[String:String]]()
var tableViewController = CustomChatingTableViewController()
override func viewDidLoad() {
let sizeTableView = CGSize(width: view.frame.size.width - 2 * margin, height: view.frame.size.height - sizeTextField.height - 2 * margin - self.navigationController!.navigationBar.frame.size.height)
let originTableView = CGPoint(x: margin, y: 2 * margin + self.navigationController!.navigationBar.frame.size.height)
tableViewController.tableView.frame = CGRect(origin: originTableView, size: sizeTableView)
tableViewController.tableView.registerClass(CellChatingTableViewCell.self, forCellReuseIdentifier: "Cell")
tableViewController.data = messageController
tableViewController.tableView.separatorStyle = .None
view.addSubview(tableViewController.tableView)
}
- CustomChatingTableViewController -CustomChatingTableViewController
import UIKit
class CustomChatingTableViewController: UITableViewController {
var data:[[String:String]]!
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as CellChatingTableViewCell
cell.setCell(data[indexPath.row]["name"] as String!, date: data[indexPath.row]["date"] as String!, message: data[indexPath.row]["message"] as String!)
return cell
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 150
}
}
** -CellChatingTableViewCell** ** -CellChatingTableViewCell **
import UIKit
class CellChatingTableViewCell: UITableViewCell {
var date = UILabel()
var message = UILabel()
func setCell(name:String,date:String,message:String){
let imageContainerMessage = UIImage(named: "orange.png")!.stretchableImageWithLeftCapWidth(24, topCapHeight: 15)
self.date.font = UIFont(name: "Arial", size: 10)
self.date.text = date
self.date.numberOfLines = 0
self.date.lineBreakMode = NSLineBreakMode.ByWordWrapping
let sizeDateLabelMax = CGSizeMake(self.frame.size.width, 9999)
let expectedSizeDate = self.date.sizeThatFits(sizeDateLabelMax)
self.date.frame = CGRect(origin: CGPoint.zeroPoint, size: expectedSizeDate)
self.message.font = UIFont(name: "Arial", size: 15)
self.message.text = message
self.message.numberOfLines = 0
self.message.lineBreakMode = NSLineBreakMode.ByWordWrapping
let sizeMessageLabelMax = CGSizeMake(self.frame.size.width, 9999)
let expectedSizeMessage = self.message.sizeThatFits(sizeMessageLabelMax)
self.message.frame = CGRect(origin: CGPoint(x: 15, y: 10), size: expectedSizeMessage)
var imageContainer = UIImageView(frame: CGRect(origin: CGPoint(x: 0, y: expectedSizeDate.height + 5), size:
CGSizeMake(expectedSizeMessage.width + 25, expectedSizeMessage.height + 25)))
imageContainer.image = imageContainerMessage
self.addSubview(self.date)
self.addSubview(imageContainer)
imageContainer.addSubview(self.message)
}
}
When I load the ViewController, everything does work fine but when I scroll the tableView, it turns horrible: 当我加载ViewController时,一切工作正常,但是当我滚动tableView时,它变得可怕:
Before scrolling : 滚动之前:
After scrolling : 滚动后:
Any suggestion? 有什么建议吗?
Thanks in advance 提前致谢
In your cellForRowAtIndexPath
, you are reusing cells. 在cellForRowAtIndexPath
,您正在重用单元格。 But then in your custom UITableViewCell
, you are adding ( self.addSubView
) self.date
and self.message
multiple times (yikes), and adding new instances of imageContainer
. 但是,然后在自定义UITableViewCell
,您要多次添加( self.addSubView
) self.date
和self.message
(yikes),并添加imageContainer
新实例。
You should either clear the cells before re-adding them, or invalidate them with new data but do not do self.addSubView
again. 您应该在重新添加之前清除单元格,或者使用新数据使它们无效,但不要再次执行self.addSubView
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.