Ios 更改tableView中以前单元格的属性

Ios 更改tableView中以前单元格的属性,ios,swift,tableview,message,Ios,Swift,Tableview,Message,我有一个以故事板设计的桌面视图,它模仿聊天界面。单元由以下部分组成: 消息文本的文本视图 发件人的配置文件映像 现在,配置文件图像显示在每个单元格中,文本气泡旁边。这很好,但是如果相同的用户在另一个之后直接发送两条或更多的消息,那么配置文件图像应该只出现在最后一个气泡上,而不出现在前一个气泡上 我尝试调用cellforrowatinexpath以获取前一个单元格的属性并更改配置文件图像的隐藏属性,但这给了我两个问题: 我在CellForRowatineXpath中调用CellForRowatin

我有一个以故事板设计的桌面视图,它模仿聊天界面。单元由以下部分组成:

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

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

我在CellForRowatineXpath中调用CellForRowatineXpath,因为这是我制作单元格UI的地方,我决定是否必须隐藏配置文件图像。我认为在内部调用这个方法不是一个好主意。 有时,当上下滚动非常快时,这无法正常工作。 我还尝试将所有单元格存储在dictionary indexath.row:Cell中,以便以后可以更快地访问它,但这给了我同样的问题,即当上下快速滚动时,它不起作用


这是一个应该如何操作的示例:

您需要先查看cellForRowAtIndexPath方法的内部,然后按照Paulw11的建议,在插入单元格后调用ReloadRowSatinExpaths:

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

您不会调用相同的方法,因为一个CellForRowatineXpath作为数据源方法在您的类中,另一个在tableview中,但是,正如您所发现的,这种方法存在问题。当您为最后一条消息创建新行时,您可能会调用insertRowsAtIndexPaths。在执行此操作的同一位置,为需要更新的行重新加载rowaatindexpaths。然后在cellForRowAtIndexPath中,您只需要根据可用的数据正确渲染单元格,这是可行的,但当我快速滚动时,它就不行了