你需要你的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()
}
}
你將不會調用相同的方法,因爲一個'cellForRowAtIndexPath'在* your *類中作爲數據源方法,另一個在tableview中,但是,這種方法存在問題,因爲您已經找到了。當你爲最後一條消息創建新行時,你可能會調用'insertRowsAtIndexPaths'。和你一樣,在你需要更新的行中調用'reloadRowaAtIndexPaths'。然後在'cellForRowAtIndexPath'中,你只需要根據可用的數據正確渲染單元 – Paulw11