编辑 Swift / 领域中的项目

Editing items in Swift / Realm

尝试做一个非常简单的待办事项应用程序,但我完全无法编辑列表中的现有项目。

这是 Item.swift 文件:

import Foundation
import RealmSwift

class Item: Object {
    @objc dynamic var title: String = ""
    @objc dynamic var done: Bool = false
    @objc dynamic var dateCreated: Date?
    @objc dynamic var order: Int = 0
    var parentCategory = LinkingObjects(fromType: Category.self, property: "items")
}

我的想法是向左滑动以获得编辑和删除按钮:

   override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath)
        -> [UITableViewRowAction]? {

            let delete = UITableViewRowAction(style: .destructive, title: "Delete",
                                              handler: handleRowAction)

            let edit = UITableViewRowAction(style: .normal, title: "Edit",
                                            handler: handleRowAction)
            edit.backgroundColor = UIColor.blue

            return [delete, edit]
    }

    func handleRowAction(action: UITableViewRowAction, indexPath: IndexPath){
        print("Action is \(action.title!) at Index Path \(indexPath)")

        let actionItem = action.title
        switch actionItem {

        case "Edit":
            print("Edit function")

            self.editModel(at: indexPath)

  case "Delete":
      print("Delete function")

      self.updateModel(at: indexPath)


        default:
            print("Default just in case")
        }

    }

    func updateModel(at indexPath: IndexPath) {
        // Update our data model
    }

    func editModel(at indexPath: IndexPath) {
        //Update our data model
    }

我在删除项目时没有遇到任何问题,但我真的不知道如何使用编辑功能。目前当我点击编辑按钮时,文本字段会弹出,它显示当前项目,但是当我输入更新并点击按钮时,显然没有任何反应。

    override func editModel(at indexPath: IndexPath) {
        var textField = UITextField()

        let alert = UIAlertController(title: "Edit Item", message: "", preferredStyle: .alert)

        let action = UIAlertAction(title: "Edit Item", style: .default) { (action) in

            var updatedItem = self.todoItems?[indexPath.row].title
            updatedItem = textField.text!

            if self.selectedCategory?.items != nil {
                do {
                    try self.realm?.write {
                    //    realm?.add(updatedItem, update: true)
                    }
                } catch {
                    print("Error savig new items, \(error)")
                }
            }

            self.tableView.reloadData()
        }

    alert.addTextField { (alertTextField) in
        alertTextField.placeholder = self.todoItems?[indexPath.row].title
        textField = alertTextField

    }

    alert.addAction(action)
    present(alert, animated: true, completion: nil)

如你所见,我试过了

realm?.add(updatedItem, update: true) 

但它给了我以下错误消息:无法将类型 'String?' 的值转换为预期的参数类型 'Object'。

我该如何解决这个问题? 谢谢!

您的问题就在这里:

updatedItem = textField.text!

您正在将其设置为字符串。但是 Realm 并不关心字符串值。它需要更新的对象本身。

尝试更换

var updatedItem = self.todoItems?[indexPath.row].title
updatedItem = textField.text!

类似

var updatedItem = self.todoItems?[indexPath.row]

有了这个改变,updatedItem 现在是 Realm 正在寻找的类型,我们现在有一个对我们可以在写入块中安全更新的项目的引用。

try self.realm?.write {
    updatedItem.title = textField.text!
    self.realm?.add(updatedItem, update: true)
}

另外,请注意,由于您的模型没有主键,它可能会创建第二个对象而不是更新第一个对象。