SwiftUI: Изменение объекта в разных представлениях

#swift #core-data #swiftui #nsmanagedobjectcontext

Вопрос:

Я работаю над проектом в SwiftUI, в основном используя основные данные. Моя основная база данных данных имеет несколько взаимосвязей: Конкретная проблема, с которой я сталкиваюсь, связана с моим «основным» классом: Биллом, у которого есть идентификатор. В Счете есть Лицо (Класс), которому он принадлежит, и, наконец, у этого Лица есть Адрес (улица, номер,…).

Мой подход до сих пор заключается в том, чтобы создать представление для этих классов, которое будет принимать данные с текстовыми полями. Итак, в BillingView я создал объект-счет и прочитал идентификатор из текстового поля. Затем я передал счет в PersonView, чтобы получить учетные данные. В PersonView я сохранил текст managedObjectContext и открыл другое представление: AddressView из BillingView. При попытке сохранить адрес я получаю сообщение об ошибке, в котором говорится, что мой человек равен нулю, хотя его следовало сохранить.

Я добавлю немного кода, чтобы уточнить:

Биллингвью:

 public var billingID: Int64 = 0

struct BillingView: View {
    @Environment(.managedObjectContext) var viewContext

@FetchRequest(
    sortDescriptors: [NSSortDescriptor(keyPath: Bill.id, ascending: true)],
    animation: .default)
private var bills: FetchedResults<Bill>

@State private var addedBill: Bool = false

@State var bill: Bill
@State private var hasPerson = false

var body: some View {
    VStack {

    //Reading and Outputting Data 

    }
    .padding()
    .toolbar {
        Button(action: addBill) {
            Label("Add Item", systemImage: "plus")
        }
    }
}


private func addBill() {
    withAnimation {
        self.bill = Bill(context: viewContext)
        self.bill.goesTo = Person(context: viewContext)
        self.bill.goesTo!.has = Address(context: viewContext)
        
        let lastID = self.bills.last?.id ?? 0
        
        self.bill.id = Int64(lastID 1)
        
        do {
            try viewContext.save()
            self.addedBill = true
        } catch {
            fatalError("Couldn't save Bill properly... (error)")
        }
    }
}

struct BillingView_Previews: PreviewProvider {
    static var previews: some View {
        BillingView(bill: Bill()).environment(.managedObjectContext, PersistenceController.preview.container.viewContext)
    }
}
 

PersonView и AddressView выглядят одинаково, я добавлю соответствующие функции AddPerson/Address.

Представление о человеке:

 private func addPerson() {
    withAnimation {
        self.bill.goesTo?.name = self.name
        self.bill.goesTo?.surname = self.surname
        self.bill.goesTo?.phone = self.phone
        
        do {
            try bill.goesTo?.managedObjectContext!.save()
            try bill.managedObjectContext!.save()
            self.submitted = true
        } catch {
            fatalError("Couln't save Person properly... (error)")
        }
    }
}
 

Адресвью:

 private func addAddress() {
        withAnimation {
            self.bill.goesTo!.has?.street = self.street
            self.bill.goesTo!.has?.number = self.number
            self.bill.goesTo!.has?.postal = self.postalCode
        
        do {
            try bill.goesTo!.has!.managedObjectContext?.save()
            try bill.goesTo!.managedObjectContext?.save()
            try bill.managedObjectContext?.save()
        } catch {
            fatalError("Couldn't save address properly... (error)")
        }
    }
}
 

Я поиграл с различными способами сохранения объекта и до сих пор не совсем уверен, какой из них правильный.

Спасибо за чтение, хорошего дня!