行删除不会更新表视图

Posted

技术标签:

【中文标题】行删除不会更新表视图【英文标题】:Row deletion doesn't update table view 【发布时间】:2017-07-09 19:19:11 【问题描述】:

我正在将数据加载到 UITableViewController 中,数据来自 Realm。所以我的 ViewController 上有一个属性:var nextWeekPlants: Results<Plant>!

变量是这样加载的:nextWeekPlants = realm.objects(Plant.self).filter("...") 在我写的updateUI() 方法中。 updateUI() 方法也调用了tableView.reloadData()

在我的numberOfRowsInSection 委托方法中,我有这个检查:

if let plants = nextWeekPlants 
    return plants.count
 else 
    return 0

好的,它可以很好地收集数据并在屏幕上显示,但是当我从表格视图中删除 1 个植物并想要删除另一个时:它崩溃了。 'RLMException', reason: 'Index 1 is out of bounds (must be less than 1)'

我这样删除一株植物:

tableView.beginUpdates()
do 
    self.realm.beginWrite()
    self.realm.delete(self.nextWeekPlants[indexPath.row])
    try self.realm.commitWrite()
 catch (let error) 
    print(error.localizedDescription)

tableView.deleteRows(at: [indexPath], with: .left)
tableView.endUpdates()

它可以很好地删除一种植物,但不会删除另一种。我是否必须以不同的方式更新 tableView(可能是调用 updateUI()?)还是我需要更新我的 Realm 集合?

** 编辑 **

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)

    // Little hack to show no extra cells and to make sure the swiping works.
    self.tableView.allowsMultipleSelectionDuringEditing = false
    self.tableView.tableFooterView = UIView()

    updateUI()


func updateUI() 
    let calendar = Calendar.current
    let maxDate = calendar.date(byAdding: .day, value: 7, to: Date())

    if let nextWeek = maxDate 
         nextWeekPlants = realm.objects(Plant.self).filter("nextWater <= %@", nextWeek)
    

    self.tableView.setEditing(false, animated: true)
    self.tableView.reloadData()

【问题讨论】:

在结束更新之前尝试 reloadData(),同时从 nextWeekPlants 中删除该对象 @jbehrens94 我猜你也需要更新表数组值。植物数组。 @RJiryes 这将更新 tableView 两次,我想这不是很好的 UI。 @TusharSharma 所以也许我需要再次调用updateUI(),因为该方法设置了领域集合属性? 能否请在您调用updateUI()的地方添加代码? 是的,只需更新 nextWeekPlants 属性 :-) 【参考方案1】:

看起来你正在改变 UITableView 状态而不让 Realm 知道它。请参考 Realm 文档的Interface-Driven Writes 部分。

do 
    self.realm.beginWrite()
    self.realm.delete(self.nextWeekPlants[indexPath.row])
    tableView.deleteRows(at: [indexPath], with: .left)
    try self.realm.commitWrite(withoutNotifying: [token])
 catch (let error) 
    print(error.localizedDescription)

【讨论】:

以上是关于行删除不会更新表视图的主要内容,如果未能解决你的问题,请参考以下文章

升级项目后:删除现有行后 NSTableVIew 无法正确更新

在 UISplitViewController 中删除详细视图中的最后一个对象时应该做啥

在 qListView 中,已删除的项目不会在视图中更新

UITableViewCell 不会在 swift 中保持突出显示

单击 CursorAdapter 中的按钮时如何在列表视图项目行中执行更新和删除操作

在 Swift 中删除表格视图的核心数据记录(行)