swift 单击按钮时如何更新领域变量?

t98cgbkg  于 2022-10-31  发布在  Swift
关注(0)|答案(3)|浏览(105)

你好,我正在尝试使用以下代码更改realm中名为'book'的对象的变量'category':

alert.addAction(UIAlertAction(title: "Reading", style: .default, handler: { (_) in
                try! realm.write {
                     let category = "reading"
                            let book = Book()
                            book.category = category
                   }
              }

当我在mangoDB realm studio中检查时,对象类别还没有更新。我看过的教程使用了相同的函数。以下是完整的更新代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    func showmethisfunction() {
        let realm = try! Realm()
        let boook = Book()

        let alert = UIAlertController(title: "Want to put your book in a list?", message: "Please Select an Option", preferredStyle: .actionSheet)

        alert.addAction(UIAlertAction(title: "Read", style: .default, handler: { (_) in
                 try! realm.write
                {
                    boook.category = "read"
                   }
              }))

              alert.addAction(UIAlertAction(title: "Want to read", style: .default, handler: { (_) in
                try! realm.write {
                    boook.category = "wanttoread"
                   }
              }))

              alert.addAction(UIAlertAction(title: "Reading", style: .default, handler: { (_) in
                try! realm.write {
                    let category = "reading"
                    boook.category = category
                   }
              }))

              alert.addAction(UIAlertAction(title: "Dismiss", style: .cancel, handler: { (_) in
                  print("User click Dismiss button")
              }))

              self.present(alert, animated: true, completion: {
                  print("completion block")
              })
    }
showmethisfunction()
}

我用一个类似的警报控制器来手动添加一本书,这是有效的,但当我想从一本书中添加一个变量时,它就不起作用了

toe95027

toe950271#

首先得到你可以更新的对象。我给出了使用过滤器的例子。你可以使用任何一个。

do {
     let realm = try Realm()
     let book = realm.objects(Book.self).filter({ $0.id == id }).first
        try realm.write {
            book?.category = category
        }
    } catch { }

或通过此链接获取想法https://docs.mongodb.com/realm-legacy/docs/swift/latest/index.html#models
转到上述链接中自动更新对象部分
我在更新您的问题后更新了我的答案。请将let boook = Book()行替换为let boook = realm.objects(Book.self).first ?? Book()

pb3s4cty

pb3s4cty2#

重申一下这个问题:
如何更新现有对象的属性
有许多不同的方法可以做到这一点,其中一些答案取决于对象模型。
一般来说,大多数对象都有一个唯一的标识符,称为 * 主键 *,如果您知道该标识符,那么更新对象就是一个简单的过程

class PersonClass: Object {
    @objc dynamic var _id = ObjectId.generate()
    @objc dynamic var name = "Jay"

    override static func primaryKey() -> String? {
        return "_id"
    }
}

ObjectId将在示例化每个对象时为其生成unique _id。

try! realm.write {
    realm.create(PersonClass.self, value: ["id": "1", "name": "Jay 2"], update: .modified)
}

这假定要更新的现有对象的主键为“1”,并将对象的name属性更新为Jay 2
您还可以通过主键读入对象,然后对其进行更新

if let jay = realm.object(ofType: PersonClass.self, forPrimaryKey: "1") {
    try! realm.write {
        jay.name = "Jays new name"
    }
}

最后,您还可以运行一个查询来获取具有匹配属性 an 对象(但不要这样做)

if let jay = realm.objects(PersonClass.self).filter("name == 'Jay'").first {
    try! realm.write {
        jay.name = "Jays new name"
    }
}

最后一个选项通常有点“危险”,因为它将过滤所有名称为“Jay”的PersonClass对象,结果将是无序的,因此first在不同的时间可能是不同的...所以这里的关键是“不要这样做”。
作为上述内容的补充说明,除非指定.sorted(byKeyPath:,否则realm结果是无序的。

a64a0gku

a64a0gku3#

您可以更新现有对象,而无需在RealmSwift中创建主键。
1.创建领域对象的键。
导入基金会导入RealmSwift
最终类ModelRealM:对象{

@objc dynamic var message = String()
@objc dynamic var type = String()

}
1.在ViewController中创建类型为(var arrData:结果!)
课堂聊天VC:UI视图控制器{
设聊天虚拟机=聊天虚拟机()
让realm = try!Realm()来尝试
变量arrData:结果出来了!

//MARK: - View Life Cycle
override func viewDidLoad() {
    super.viewDidLoad()

    arrData = realm.objects(ModelRealM.self)
    var model = ModelRealM()

    model.message = "ABC"
    model.type = "Text"

    self.chattingVM.saveData(model) { isDone in

        if isDone{

            self.tableView.reloadData()

        }

    }

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return chattingVM.realm.objects(ModelRealM.self).count

}

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

    guard let type = arrData?[indexPath.row].type else{

        print("------------No Data found------------")
        return UITableViewCell()

    }
    if type == "Receiver"{

        let cell = tableView.dequeueReusableCell(withIdentifier: "ReceiverCell", for: indexPath) as! ReceiverCell
        cell.model = arrData?[indexPath.row]
        cell.editBtn.tag = indexPath.row
        cell.editBtn.addTarget(self, action: #selector(self.editReceiverBtn(sender:)), for: .touchUpInside)
        return cell

    }else{

        let cell = tableView.dequeueReusableCell(withIdentifier: "SenderCell", for: indexPath) as! SenderCell
        cell.model = arrData?[indexPath.row]
        cell.editBtn.tag = indexPath.row
        cell.editBtn.addTarget(self, action: #selector(self.editReceiverBtn(sender:)), for: .touchUpInside)
        return cell

    }

}

@objc func editReceiverBtn(sender:UIButton){

    self.txtView.text = "" //Write the updated message in TxtView and pass in this function.
    self.chattingVM.updateReamObject(index: sender.tag, msg: self.txtView.text) { isTrue in

        if isTrue{

            self.tableView.reloadData()

        }

    }

}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableView.automaticDimension
}

}
1.视图中模型更新功能用于更新
类聊天虚拟机{

//MARK: - Variables
let realm = try! Realm()

//MARK: -
//MARK: - Save Data to Realm
func saveData(_ data : ModelRealM,completion:@escaping(_ isDone: Bool) -> Void){

    do{
        try realm.write {
            realm.add(data)
        }
    }catch{
        print("Error in saving data :- \(error.localizedDescription)")
    }

    completion(true)

}

//MARK: -
//MARK: - Update Data
func updateReamObject(index:Int,msg:String,completion:@escaping(_ isTrue:Bool) -> Void){

    do{
        try realm.write {
            realm.objects(ModelRealM.self)[index].message = msg
        }
    }catch{
        print("Error in saving data :- \(error.localizedDescription)")
    }

    completion(true)

}

}

相关问题