从 UICollectionView 中删除单元格而不重新加载
Delete Cell from UICollectionView Without Reloading
我的应用程序正在侦听一个套接字事件,该事件告诉它何时更新了屏幕上 collectionView
当前显示的数据。发生这种情况时,我想从数据源和 collectionView
中删除与更新行对应的单元格。我可以这样做:
- 过滤数据以仅包含 ID 与更新项目的 ID 不同的项目
- 将此新数据设置为
collectionView
使用的数据
重新加载 collectionView
socket.on(DATA_UPDATE) { (data, ack) in
if let dat = data[0] as? [String: Any] {
if let tabId = dat["tabId"] as? Int, let resId = dat["resId"] as? Int {
let remainingData = self.data?.filter{ [=10=].tabId != tabId }
if resId == self.restaurant?.id && remainingData?.count != self.data?.count {
self.data = remainingData
self.filterTableDataAndRelaod()
}
}
}
}
问题在于它会更新整个 collectionView
并且还会向上滚动到顶部。我想改为使用以下代码来执行此操作:
self.data.remove(at: indexPath.row)
collectionView.deleteItems(at: [indexPath])
但是,我不确定如何获取上面代码片段中的indexPath
。
你可以试试
var toDele = [IndexPath]()
if let tabId = dat["tabId"] as? Int, let resId = dat["resId"] as? Int {
for (index,item) in self.data?.enumerated() {
if item.tabId == tabId {
toDele.append(IndexPath(item:index,section:0))
}
}
for item in toDele {
self.data?.remove(at:item.item)
}
collectionView.deleteItems(at:toDele )
}
或者如果您没有重复项
if let tabId = dat["tabId"] as? Int, let resId = dat["resId"] as? Int {
if let ind = self.data?.firstIndex(where:{ [=11=].tabId == tabId }) {
self.data?.remove(at:ind)
collectionView.deleteItem(at:IndexPath(item:ind,section:0))
}
}
我的应用程序正在侦听一个套接字事件,该事件告诉它何时更新了屏幕上 collectionView
当前显示的数据。发生这种情况时,我想从数据源和 collectionView
中删除与更新行对应的单元格。我可以这样做:
- 过滤数据以仅包含 ID 与更新项目的 ID 不同的项目
- 将此新数据设置为
collectionView
使用的数据
重新加载
collectionView
socket.on(DATA_UPDATE) { (data, ack) in if let dat = data[0] as? [String: Any] { if let tabId = dat["tabId"] as? Int, let resId = dat["resId"] as? Int { let remainingData = self.data?.filter{ [=10=].tabId != tabId } if resId == self.restaurant?.id && remainingData?.count != self.data?.count { self.data = remainingData self.filterTableDataAndRelaod() } } } }
问题在于它会更新整个 collectionView
并且还会向上滚动到顶部。我想改为使用以下代码来执行此操作:
self.data.remove(at: indexPath.row)
collectionView.deleteItems(at: [indexPath])
但是,我不确定如何获取上面代码片段中的indexPath
。
你可以试试
var toDele = [IndexPath]()
if let tabId = dat["tabId"] as? Int, let resId = dat["resId"] as? Int {
for (index,item) in self.data?.enumerated() {
if item.tabId == tabId {
toDele.append(IndexPath(item:index,section:0))
}
}
for item in toDele {
self.data?.remove(at:item.item)
}
collectionView.deleteItems(at:toDele )
}
或者如果您没有重复项
if let tabId = dat["tabId"] as? Int, let resId = dat["resId"] as? Int {
if let ind = self.data?.firstIndex(where:{ [=11=].tabId == tabId }) {
self.data?.remove(at:ind)
collectionView.deleteItem(at:IndexPath(item:ind,section:0))
}
}