我用类似功能制作了一个聊天应用程序。
这是一个每10秒获取一次新消息数据的应用程序。
我想更新消息。我知道只需覆盖屏幕外单元格的 dataSource 即可。
let visibleRowsIndexPaths = tableView.indexPathsForVisibleRows!
for indexPath in visibleRowsIndexPaths {
// Loading the new data (updated message, likes count)
let message = MessagesStore.shared.messages[indexPath.row]
if let cell = self.tableView.cellForRow(at: indexPath) as? MessageCell {
cell.messageLabel.text = message.message
cell.likesButton.setTitle("\(message.likes!) likes", for: .normal)
} else if let cell = self.tableView.cellForRow(at: indexPath) as? OwnMessageCell {
cell.messageLabel.text = message.message
cell.likesButton.setTitle("\(message.likes!) likes", for: .normal)
}
}
但屏幕上的细胞呢?
...
使用我编写的代码是否有效?
tableView.reloadData()
我也可以使用// Get a list of all the buttons in the group
let buttons = Array.from(document.querySelectorAll('[type=button]'))
// For each button add a click event listener
// This allows us to remove the 'onclick' from the html
buttons.forEach(item => {
item.addEventListener('click', e => {
// When the button is clicked, remove the active state
// Then add the inactive state
buttons.forEach(button => {
// If the current button does not equal the clicked button
// Remove the active state class
button != e.currentTarget && button.classList.remove("actief")
button.classList.add("nietactief")
})
// Toggle the state of the clicked button
item.classList.toggle("actief")
})
})
,但它会导致一些错误,比如某些时候选择消失,tableView跳转,它不顺畅..
我的代码工作得很好而且流畅,但效率很高吗?
答案 0 :(得分:1)
您在两个代码块中都是这样做的。在最糟糕的情况下,你要求你的tableView两次为一个单元格 - 只是因为类不匹配(但你的需求是相同的)。
接口(ObjC中的协议)允许您定义方法签名(以及Swift中的属性?)。这就是我在ObjC中所做的:定义一个协议(其他语言的接口),只需要这个tableView的任何单元来实现它。
此尝试还可以进一步添加其他细胞,这些细胞提供几乎相同的功能。
答案 1 :(得分:0)
您可以使用self.tableView.reloadData()
重新加载整个表格,或self.tableView.reloadRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.None)
重新加载特定单元格。
您可以阅读有关UITableView类here
的更多信息