我正在尝试对tableView中的聊天重新排序。最近更新的聊天记录应插入IndexPath(row: 0, section: 1)
。
我的理解是,为了删除一行,它必须是可见的。
如果该行不可见,那么在更新数据源时,我只需要tableView.insertRows(at: [newIndex], with: .fade)
。
***由于未捕获的异常而终止应用程序 “ NSInternalInconsistencyException”,原因:“无效的更新:无效 第1节中的行数。 更新(17)之后的现有部分必须等于 该部分包含在更新之前的行(17),正负 从该部分插入或删除的行数(已插入1条, 0已删除),加上或减去移入或移出的行数 该部分(移入0,移出0)。
//chats of the currentUser
var currentUserChats = [Chat]() {
didSet(newValue){
attachChildChangedObserverOn(chat: newValue)
}
}
var observersArray = [String: UInt]() // chatUID: handle
//attach childChange listener on each chat downloaded
func attachChildChangedObserverOn(chat: Chat) {
var handle: UInt = 0
let ref = DDatabaseRReference.chats.reference().child(chat.chatUID).child("users").child(currentUser.userUID)
handle = ref.observe(.childChanged, with: {[weak self] (snapshot) in
self?.observersArray[chat.chatUID] = handle
guard snapshot.exists() else {return}
let chatChanged = chat
var lastMessage = ""
var unreadMessagesCount = 0
var lastUpdate = 0.0
switch snapshot.key {
case "lastMessage" :
lastMessage = snapshot.value as! String
chatChanged.lastMessage = lastMessage
case "unreadMessagesCount":
unreadMessagesCount = snapshot.value as! Int
if let index = chatChanged.users.index(of: (self?.currentUser)!) {
let userChanged = chatChanged.users[index]
userChanged.unreadMessagesCount = unreadMessagesCount
chatChanged.users.remove(at: index)
chatChanged.users.insert(userChanged, at: index)
}
case "lastUpdate":
lastUpdate = snapshot.value as! Double
chatChanged.lastUpdate = lastUpdate
default: return
}
let newIndex = IndexPath(row: 0, section: 1)
// get indexOf chatChanged
guard let index = self?.currentUserChats.index(of: chatChanged) else {return}
let indexPathOfOldChat = IndexPath(row: index, section: 1)
// - update Data Source
// - reloadRow
if indexPathOfOldChat.row == 0 {
self?.currentUserChats.remove(at: 0)
self?.currentUserChats.insert(chatChanged, at: 0)
self?.tableView.reloadRows(at: [newIndex], with: .fade)
return
}
//get visible indexes of cells in TableView
let visibleIndexes = self?.tableView.indexPathsForVisibleRows
//check if the index of chat to be updated is visible
if let indexes = visibleIndexes,
indexes.contains(indexPathOfOldChat) {
//index is visible
// update Data Source, delete row & insert row
self?.tableView.beginUpdates()
self?.currentUserChats.remove(at: indexPathOfOldChat.row)
self?.tableView.deleteRows(at: [indexPathOfOldChat], with: .fade)
self?.currentUserChats.insert(chatChanged, at: 0)
self?.tableView.insertRows(at: [newIndex], with: .fade)
self?.tableView.endUpdates()
return
}
//if index is not visible:
// - update Data Source
// - insert the row
self?.currentUserChats.remove(at: index)
self?.currentUserChats.insert(chatChanged, at: 0)
self?.tableView.beginUpdates()
self?.tableView.insertRows(at: [newIndex], with: .fade)
self?.tableView.endUpdates()
return
})
}
答案 0 :(得分:0)
事实证明可以删除不可见的行。
最初,我以为如果尝试删除不可见的行会出现错误,因为该行的该单元格不再位于视图中。
Color.parseColor()