我正在显示由RxRealmDataSources驱动的UITableView
。
当表中的一行被删除时,我需要执行一些操作。
有没有一种方法,每当从表中删除一行时,就会使用已删除行的索引路径调用一个函数?
编辑-
我的应用中UITableView
单元格的UI取决于两件事-
无论何时删除一个单元格,我都需要更新其下一个单元格的UI。
如果更新数据库的唯一方法是通过用户的直接操作,那么我本可以使用func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
方法来获取应删除的单元格indexPath
并更新下一个单元格的用户界面。
但是,数据库已同步到云,并且数据库已绑定到表视图,因此我无法控制何时添加或删除单元格。出于这个原因,我想知道是否有办法知道何时从UITableView
答案 0 :(得分:0)
由于UITableView
中单元格的可重用性,直到表本身被释放后,单元格才真正被删除。
我可能会假设通过“删除”单元格来表示单元格从屏幕上消失了。在这种情况下,UITableViewDelegate
的以下功能可能会对您有所帮助(在该单元格不再可见时调用):
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath)
答案 1 :(得分:0)
我能够通过继承UITableView
类并重写func deleteRows(at indexPaths: [IndexPath], with animation: UITableView.RowAnimation)
方法来解决此问题。
答案 2 :(得分:0)
在评论中您说:
“删除”是指从表格视图中删除该单元格,就像我们向左滑动该单元格将其删除一样。
自从标记了RxSwift以来,解决方案是使用itemDeleted
,如下所示:
tableView.rx.itemDeleted
.subscribe(onNext: { print("delete item at index path \($0) from your model.")})
.disposed(by: bag)
如果您不希望使用Rx解决方案,那么您的问题是一个重复的问题:
答案 3 :(得分:0)
您必须实现1个UITableView委托方法。
易于实现。此委托方法将被调用两次,一次在您滑动时,另一次在您按下以删除行时。
`enter code here`
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let config = UISwipeActionsConfiguration(actions: [makeDeleteContextualAction(forRowAt: indexPath)])
config.performsFirstActionWithFullSwipe = true
return config
}
private func makeDeleteContextualAction(forRowAt indexpath:IndexPath) -> UIContextualAction {
let deleteAction = UIContextualAction(style: .destructive, title: LocalizableConstants.constLS_global_delete()) { (action, swipeButtonView, completion) in
let product = self.products[indexpath.row]
if let quantity = product.vo_quantity(), let amount = product.vo_priceFide() {
self.totalProducts -= Int(truncating: quantity)
self.totalAmount -= amount.doubleValue * quantity.doubleValue
}
DispatchQueue.main.async {
self.lbBasketNumber.text = String(self.totalProducts)
self.lbTotalAmount.text = String(self.totalAmount)
}
self.products.remove(at: indexpath.row)
self.tableView.deleteRows(at: [indexpath], with: .fade)
if #available(iOS 13.0, *) {
action.image = ImagesConstants.constIMG_XCA_mini_icon_red_trash()
action.image?.withTintColor(ConstantsColor.const_COLOR_RED())
action.backgroundColor = ConstantsColor.const_COLOR_WHITE()
} else {
action.title = LocalizableConstants.constLS_global_delete()
}
completion(true)
}
return deleteAction
}