gpt4 book ai didi

ios - 后退按钮和创建新条目导致应用程序崩溃(无法修改 UUID)Realm Swift

转载 作者:行者123 更新时间:2023-11-28 13:38:03 30 4
gpt4 key购买 nike

当我从 VC2(使用提供的后退按钮作为导航的一部分)返回 VC1(它允许用户输入一本书的标题并在 Realm 中创建一个条目,包括该书的标题和 UUID)时 Controller 而不是自定义 segue),然后在 Realm 中创建一个新的书籍对象(通过在 VC1 中的文本字段中添加另一个标题),应用程序崩溃说我无法在设置后修改主键。

我打算创建一个新条目(理论上我可以添加一个,返回,添加另一个等等)而不是尝试覆盖现有条目。

我已经阅读了文档(甚至查看了一个类似的东西正在工作的旧项目),但我不明白为什么它不只是创建一个新条目。我查看了 Realm 文档(例如在这个答案中引用 Realm in IOS: Primary key can't be changed after an object is inserted )

此处的代码是 VC1,允许用户创建新小说(通过在代码前面的文本字段中添加标题)

func createNewNovel() {

let realm = try! Realm()
novelCreated.novelID = UUID().uuidString
novelCreated.novelTitle = novelTitleInput.text!
novelCreated.createdDate = Date()

do {
try realm.write {
realm.add(novelCreated)
print ("Novel Created Successfully")
}
} catch {
print("error adding novel")
}

然后我准备将 novelID 传递给 VC2:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let novelData = NovelObject()
novelData.novelID = novelCreated.novelID

if let destVC = segue.destination as? WriteVC {
destVC.novelIDPassed = novelData.novelID

}
}

这工作正常,并且通过在 VC1 上按下按钮触发 segue。我还可以在 VC2 中打印小说的 ID,这样就可以正常工作了。

但是...当我从 VC2 返回并在 VC1 的文本字段中输入新标题时,它应该创建一个新的 NovelObject,而不是尝试更新现有的(这会导致它崩溃)。理论上你甚至可以两次拥有相同的书名,但它们应该有不同的 UUID(这是主键)

我一定是遗漏了一些我认为微不足道但无法解决的问题!

小说是在顶部创建的:

class NewNovelVC: UIViewController {

let novelCreated = NovelObject()

@IBOutlet weak var novelTitleInput: UITextField!
@IBOutlet weak var createButtonOutlet: UIButton!

然后用变量填充它

最佳答案

这是由于内存中相同对象的经典问题被重新实例化,它指向相同的主键值。在这里创建一个单例类也非常方便。

创建服务文件。这将使您的 RealSwift 在特定线程上初始化为您的当前 block 。

RealService.swift

import RealmSwift

class RealmService {

static let uirealm = RealmService()

private var _initRS = try! Realm()

var realm: Realm! {
return _initRS
}
}

Novel.swift :

import RealmSwift

class Novel : Object {

@objc dynamic var uid : String? = nil
@objc dynamic var title: String? = nil

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

}

extension Novel {

func writeToRealm(){
try? RealmService.uirealm.realm.write {
print("Creating the Novel Object")
RealmService.uirealm.realm.add(self, update: true)
}
}

func DeleteFromRealm(object: Results<Novel>){
try? RealmService.uirealm.realm.write {
print("Deleting the Novel Object")
RealmService.uirealm.realm.delete(object)
}
}

}

并按照@Don 提到的那样实现,在您设置标题的 block 中写入。

   var novel: Novel! // Declare this in above in the class.

novel = Novel()
novel.title = title
novel.uid = uid
novel.writeToRealm()

希望对您有所帮助。

关于ios - 后退按钮和创建新条目导致应用程序崩溃(无法修改 UUID)Realm Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56359972/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com