SwiftUI - обновить вид после добавления записи CoreData - PullRequest
0 голосов
/ 02 августа 2020

Когда пользователь хочет создать новую запись, я хотел бы: a) go для нового представления, 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.
    }
}

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Что в итоге сработало, так это объединение NavigationLink с Button, как объяснил @kontiki. Это позволило мне создать новую запись до того, как перейдет в новое представление. Я не уверен, что это лучшее решение, но оно определенно работает! В приведенном ниже коде показана теория, лежащая в основе решения.

@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
    }
}
0 голосов
/ 02 августа 2020

Меня немного смущает бит, в котором вы говорите, что хотите создать запись onAppear, пока пользователь создавал запись? В любом случае я бы, вероятно, создал переменную для текста и установил ее для новой записи внутри функции onAppear. Хотя вся запись onAppear create меня по-прежнему смущает и может усложнить реализацию переменной.

...