更改tableView中先前单元格的属性

时间:2015-09-14 20:10:52

标签: ios swift tableview message

我有一个在故事板中设计的tableView,它模仿聊天UI。一个单元格由:

组成
  • 消息文本的 TextView
  • 发件人的个人资料图片

现在,配置文件图像显示在文本气泡旁边的每个单元格中。这很好,但是如果相同的用户直接发送两个或多个消息,那么配置文件图像应该只显示在最后一个气泡而不是前一个气泡上。

我尝试调用 cellForRowAtIndexPath 来获取之前单元格的属性并更改配置文件图像的隐藏属性,但这给了我两个问题:

  1. 我在 cellForRowAtIndexPath 中调用 cellForRowAtIndexPath ,因为我在那里制作了单元格UI,并决定是否必须隐藏个人资料图片或不。我不认为在这个内部调用这个方法是个好主意。
  2. 有时(当上下滚动非常快)时,这不能正常工作。
  3. 我还试图将所有单元格存储在字典中(indexPath.row:Cell),所以我可以在以后更快地访问它,但是这给了我同样的问题,即它在向上和向下滚动时不起作用

    这是一个例子:http://tinypic.com/view.php?pic=2qavj9w&s=8#.Vfcpi7yJfzI

1 个答案:

答案 0 :(得分:0)

您需要在cellForRowAtIndexPath方法中向前看,并且正如Paulw11建议的那样,在插入单元格后调用reloadRowsAtIndexPaths

import UIKit

struct MyMessage {
    let sender: String
    let text: String
}

class MyTableViewCell: UITableViewCell {
    var message: MyMessage?
    var showProfileImage: Bool = false
}

class MyTableViewController: UITableViewController {

    private var _messages: [MyMessage] = []

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self._messages.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let message = self._messages[indexPath.row]
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! MyTableViewCell
        cell.message = message
        if self._messages.count > indexPath.row + 1 {
            let nextMessage = self._messages[indexPath.row + 1]
            cell.showProfileImage = message.sender != nextMessage.sender
        } else {
            cell.showProfileImage = true
        }
        return cell
    }

    func addMessage(message: MyMessage) {
        let lastIndexPath = NSIndexPath(forRow: self._messages.count - 1, inSection: 0)
        let indexPath = NSIndexPath(forRow: self._messages.count, inSection: 0)
        self._messages.append(message)
        self.tableView.beginUpdates()
        self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Bottom)
        self.tableView.reloadRowsAtIndexPaths([lastIndexPath], withRowAnimation: UITableViewRowAnimation.Fade)
        self.tableView.endUpdates()
    }
}