【问题标题】:How to delete objects from Realm using UITableView - Swift如何使用 UITableView 从 Realm 中删除对象 - Swift
【发布时间】:2017-04-17 12:45:12
【问题描述】:

通过UITableViewRealm 删除对象的最常见方式(代码结构)是什么?

以下代码可以很好地在 UITableView 中显示来自 Realm 的数据,但如果我需要删除一行并更新 Realm 则不能,因为 Results 没有 remove 方法。

我是否需要将我的对象放入List 并通过它进行删除?如果这是最常用的方法,我不太确定如何让来自Realm 的“列表”和Results 保持同步。

模型类

import RealmSwift

class Item:Object {
    dynamic var productName = ""
}

主视图控制器

let realm = try! Realm()
var items : Results<Item>?

var item:Item?

override func viewDidLoad() {
    super.viewDidLoad()

    self.items = realm.objects(Item.self)
}

func addNewItem(){
        item = Item(value: ["productName": productNameField.text!])
        // Save to Realm
        try! realm.write {
            realm.add(item!)
        }
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.items!.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "reusableCell", for: indexPath)
    let data = self.items![indexPath.row]
    cell.textLabel?.text = data.productName
    return cell
}

删除行

UITableView 中删除行的标准方法当然在这种情况下不起作用,因为我使用的是来自 Realm 的默认 Results 容器。

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCellEditingStyle.delete{
        items!.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
    }
}

同样,从RealmUITableView 删除对象的最常用方法是什么?

谢谢

【问题讨论】:

    标签: ios swift uitableview realm


    【解决方案1】:

    为简洁起见,省略了一些展开和捕获逻辑

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == UITableViewCellEditingStyle.delete{
            if let item = items?[indexPath.row] {
                try! realm.write {
                    realm.delete(item)
                }
                tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
            }
        }
    }
    

    【讨论】:

    • 哦,我明白了,Realm 类,哎呀。非常感谢!
    • 快速提问,你知道如何在Results 的开头而不是最后(默认)添加/插入项目吗?换句话说,我想始终在 [0] 索引处插入项目。类似...try! realm.write {realm.insert(item!, at:0)},但当然Realm 没有插入方法。
    • 这是一个不同的问题 - 我建议在单独的线程中提问。 SO 管理员对不相关的后续行动不屑一顾。如果你问我并标记我,我很乐意回答。
    • @dmorrow - 这是新问题。非常感谢你的帮助。 stackoverflow.com/questions/43471106/…
    【解决方案2】:

    你也可以实现这个块:

       if let item = items?[indexPath.row] {
                    do {
                        try realm.write {
                            realm.delete(item)
                        }
                    } catch {
                        print("Error deleting item, \(error)")
                    }
                    tableView.reloadData()
                }
    

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2018-07-11
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多