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
    }
}