2014-12-03 111 views
0

我使用swift创建一个聊天应用程序。在我的故事板上,我有一个负责显示消息的视图控制器。我有3个迅速文件:Swift - 滚动时tableViewCell问题

  • ChatingViewController:与视图控制器上的脚本中

  • CustomChatingTableViewController相关

  • CellChatingTableViewCell

被显示在小区内的每个消息类。我以编程方式创建tableView。

- 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

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

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) 
} 
} 

当我加载视图控制器,一切都没有工作正常,但当我滚动的tableView,它变成可怕:

之前滚动:

enter image description here

滚动后:

enter image description here

任何建议?

在此先感谢

回答

1

在你cellForRowAtIndexPath,正在重用的细胞。但在您的自定义UITableViewCell中,您正在添加(self.addSubViewself.dateself.message多次(yikes),并添加imageContainer的新实例。

您应该在重新添加它们之前清除单元格,或者使用新数据使它们失效,但不要再次执行self.addSubView

+0

谢谢,这很完美! – soling 2014-12-03 18:13:09