有没有办法知道何时从UITableView中删除UITableViewCell?

时间:2018-12-18 05:38:12

标签: ios swift uitableview realm rx-swift

我正在显示由RxRealmDataSources驱动的UITableView

当表中的一行被删除时,我需要执行一些操作。

有没有一种方法,每当从表中删除一行时,就会使用已删除行的索引路径调用一个函数?

编辑-

我的应用中UITableView单元格的UI取决于两件事-

  • 从领域db(info)获取的数据对象
  • 行的索引位置

无论何时删除一个单元格,我都需要更新其下一个单元格的UI。

如果更新数据库的唯一方法是通过用户的直接操作,那么我本可以使用func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)方法来获取应删除的单元格indexPath并更新下一个单元格的用户界面。

但是,数据库已同步到云,并且数据库已绑定到表视图,因此我无法控制何时添加或删除单元格。出于这个原因,我想知道是否有办法知道何时从UITableView

中删除一个单元格

4 个答案:

答案 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解决方案,那么您的问题是一个重复的问题:

Add swipe to delete UITableViewCell

答案 3 :(得分:0)

您必须实现1个UITableView委托方法。

  • trailingSwipeActionsConfigurationForRowAt

易于实现。此委托方法将被调用两次,一次在您滑动时,另一次在您按下以删除行时。

`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
    }