更改 tableView 中先前单元格的属性
Change properties of previous cells in tableView
我有一个 tableView,在故事板中设计,模仿聊天 UI。一个单元格包括:
- A TextView 消息文本
- 发件人的个人资料图片
现在,个人资料图片显示在每个单元格中,紧挨着文本气泡。这很好,但是如果相同的用户连续发送两条或更多条消息,则个人资料图片应该只出现在最后一个气泡上,而不是前一个气泡上。
我尝试调用 cellForRowAtIndexPath 来获取前一个单元格的属性并更改个人资料图像的隐藏 属性,但这给了我两个问题:
- 我在 cellForRowAtIndexPath 中调用 cellForRowAtIndexPath,因为那是我制作单元格 UI 并决定配置文件的地方图像必须隐藏或不隐藏。我不认为在其内部调用此方法是个好主意。
- 有时(当非常快速地上下滚动时)这不能正常工作。
我还尝试将所有单元格存储在字典中(indexPath.row:单元格),这样我以后可以更快地访问它,但这给了我同样的问题,即向上滚动时它不起作用下得真快。
这是它应有的样子的说明:http://tinypic.com/view.php?pic=2qavj9w&s=8#.Vfcpi7yJfzI
您需要在 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()
}
}
我有一个 tableView,在故事板中设计,模仿聊天 UI。一个单元格包括:
- A TextView 消息文本
- 发件人的个人资料图片
现在,个人资料图片显示在每个单元格中,紧挨着文本气泡。这很好,但是如果相同的用户连续发送两条或更多条消息,则个人资料图片应该只出现在最后一个气泡上,而不是前一个气泡上。
我尝试调用 cellForRowAtIndexPath 来获取前一个单元格的属性并更改个人资料图像的隐藏 属性,但这给了我两个问题:
- 我在 cellForRowAtIndexPath 中调用 cellForRowAtIndexPath,因为那是我制作单元格 UI 并决定配置文件的地方图像必须隐藏或不隐藏。我不认为在其内部调用此方法是个好主意。
- 有时(当非常快速地上下滚动时)这不能正常工作。
我还尝试将所有单元格存储在字典中(indexPath.row:单元格),这样我以后可以更快地访问它,但这给了我同样的问题,即向上滚动时它不起作用下得真快。
这是它应有的样子的说明:http://tinypic.com/view.php?pic=2qavj9w&s=8#.Vfcpi7yJfzI
您需要在 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()
}
}