繁体   English   中英

如何使用UITableView从Realm删除对象-Swift

[英]How to delete objects from Realm using UITableView - Swift

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

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

我是否需要将对象放入List并通过List进行删除? 如果这是最常用的方法,那么我不确定如何使“列表”和RealmResults保持恒定同步。

模型类

import RealmSwift

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

主ViewController

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

同样,通过UITableViewRealm删除对象的最常用方法是什么?

谢谢

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

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

您还可以实现以下代码块:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM