SwiftUI - 添加 CoreData 记录后更新视图
SwiftUI - update view after adding CoreData record
当用户想要创建新记录时,我想 a) 转到新视图,b) 在 .onAppear
期间创建记录,然后 c) 使用新创建的记录。
第一部分很简单。我有一个 NavigationLink
和用户名 属性 一起转到新视图。我可以在 .onAppear
期间创造新记录。但这是事情变得棘手的最后一部分。
我试过用同时手势创建记录和切换视图,我试过用切换视图功能加载新视图,还有大约一打不太有灵感的想法。问题总是归结为:如何在创建新记录后更新 FetchRequest?注意:我需要对新创建记录的引用,以便用户可以将事情添加到记录中。
到目前为止,这是代码...
struct RecordView: View {
@Environment(\.managedObjectContext) var moc
let appDelegte = UIApplication.shared.delegate as! AppDelegate
var fetchedRecords: FetchRequest<Record>
var currentUser: User
init(recordNumber: String) {
fetchedRecords = FetchRequest<Record>(entity: Record.entity(), sortDescriptors: [], predicate: NSPredicate(format: "user.recordNumber = %@", recordNumberNumber))
}
var body: some View {
Text(fetchedRecords.wrappedValue.first.recordNumber)
}
.onAppear {
self.CreateNewRecord()
}
func CreateNewRecord() {
let newRecord = Record(context: self.moc)
newRecord.id = UUID()
let recordNumber = "AABBCCDDEE"
user.addToRecords(newRecord)
appDelegate.saveContext()
//This is when the fetched request should fetch the new record and the Text view should be updated.
}
}
我有点困惑你说你想在用户创建记录时在 onAppear 上创建记录?无论如何,我可能会为文本创建一个变量并将其设置为 onAppear 函数内的新记录。虽然整个 onAppear create record 仍然让我很困惑,可能会使变量的实现变得更加困难。
正如@kontiki 所解释的那样,最终起作用的是将 NavigationLink 与 Button 组合在一起。这让我可以在 进入新记录之前 创建一个新记录 view.I 我不确定这是最好的解决方案,但它确实有效!下面的代码显示了解决方案背后的理论。
@State private var presentMe = false
@State var currentNumber = 10
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: SecondView(number: currentNumber), isActive: $presentMe) { EmptyView() }
Button(action: {
//This is where I created a new record and saved to Core Data
self.currentNumber = 5
//I was then able to pass the new record to the second view through the navigation link
self.presentMe = true
}) {
Text("Go to SecondView")
}
}
}
}
}
struct SecondView: View {
var number: Int
var body: some View {
Text("The number is now = \(number)") //The number is now = 5
}
}
当用户想要创建新记录时,我想 a) 转到新视图,b) 在 .onAppear
期间创建记录,然后 c) 使用新创建的记录。
第一部分很简单。我有一个 NavigationLink
和用户名 属性 一起转到新视图。我可以在 .onAppear
期间创造新记录。但这是事情变得棘手的最后一部分。
我试过用同时手势创建记录和切换视图,我试过用切换视图功能加载新视图,还有大约一打不太有灵感的想法。问题总是归结为:如何在创建新记录后更新 FetchRequest?注意:我需要对新创建记录的引用,以便用户可以将事情添加到记录中。
到目前为止,这是代码...
struct RecordView: View {
@Environment(\.managedObjectContext) var moc
let appDelegte = UIApplication.shared.delegate as! AppDelegate
var fetchedRecords: FetchRequest<Record>
var currentUser: User
init(recordNumber: String) {
fetchedRecords = FetchRequest<Record>(entity: Record.entity(), sortDescriptors: [], predicate: NSPredicate(format: "user.recordNumber = %@", recordNumberNumber))
}
var body: some View {
Text(fetchedRecords.wrappedValue.first.recordNumber)
}
.onAppear {
self.CreateNewRecord()
}
func CreateNewRecord() {
let newRecord = Record(context: self.moc)
newRecord.id = UUID()
let recordNumber = "AABBCCDDEE"
user.addToRecords(newRecord)
appDelegate.saveContext()
//This is when the fetched request should fetch the new record and the Text view should be updated.
}
}
我有点困惑你说你想在用户创建记录时在 onAppear 上创建记录?无论如何,我可能会为文本创建一个变量并将其设置为 onAppear 函数内的新记录。虽然整个 onAppear create record 仍然让我很困惑,可能会使变量的实现变得更加困难。
正如@kontiki 所解释的那样,最终起作用的是将 NavigationLink 与 Button 组合在一起。这让我可以在 进入新记录之前 创建一个新记录 view.I 我不确定这是最好的解决方案,但它确实有效!下面的代码显示了解决方案背后的理论。
@State private var presentMe = false
@State var currentNumber = 10
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: SecondView(number: currentNumber), isActive: $presentMe) { EmptyView() }
Button(action: {
//This is where I created a new record and saved to Core Data
self.currentNumber = 5
//I was then able to pass the new record to the second view through the navigation link
self.presentMe = true
}) {
Text("Go to SecondView")
}
}
}
}
}
struct SecondView: View {
var number: Int
var body: some View {
Text("The number is now = \(number)") //The number is now = 5
}
}