编辑 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)
}
另外,请注意,由于您的模型没有主键,它可能会创建第二个对象而不是更新第一个对象。
尝试做一个非常简单的待办事项应用程序,但我完全无法编辑列表中的现有项目。
这是 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)
}
另外,请注意,由于您的模型没有主键,它可能会创建第二个对象而不是更新第一个对象。