Непоследовательные обновления ContentView от @Environment var Changes - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть простое приложение SwiftUI, CoreData.Архитектура - это основной список со вторым видом для просмотра деталей или их редактирования.Кажется, что базовая структура работает с одним важным исключением.При редактировании записи первое редактирование после запуска приложения правильно отображается после возврата в список ContentView.Второе и последующие изменения не отображаются в списке при возврате к ContentView.Изменения в базе данных сохранены правильно.Перезапуск приложения покажет правильные данные.Я также создал TabView.Если я отключаю код возврата к основному списку после редактирования и использую только TabView для переключения, изменения всегда отображаются.

Вот код (я удалил большинство повторяющихся полей данных).

В SceneDelegate:

let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let tabby = TabBar().environment(\.managedObjectContext, managedObjectContext)
window.rootViewController = UIHostingController(rootView: tabby)

В ContentView:

@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: ToDoItem.getAllToDoItems()) var toDoItems: FetchedResults<ToDoItem>

@State private var newToDoItem = ""
@State private var gonnaShow = true
@State private var show = false

var body: some View {
    NavigationView {
        List {
             Section(header: Text("Records")) {
                ForEach(self.toDoItems) { toDoItem in
                    NavigationLink(destination: EditToDo(toDoItem: toDoItem)) {
                        ToDoItemView(
                            idString: toDoItem.myID.uuidString,
                            title: toDoItem.title!,
                            firstName: toDoItem.firstName!,
                            lastName: toDoItem.lastName!,
                            createdAt: self.localTimeString(date: toDoItem.createdAt!)
                                    )
                    }
                }//for each
                .onDelete { indexSet in
                    let deleteItem = self.toDoItems[indexSet.first!]
                    self.managedObjectContext.delete(deleteItem)

                    do {
                        try self.managedObjectContext.save()
                    } catch {
                        print(error)
                    }
                }
                .onMove(perform: move)
            }
        }
        .navigationBarTitle("Customers")
        .navigationBarItems(trailing: EditButton())
    }
}

Отдельный файл EditToDo:

@Environment(\.managedObjectContext) var managedObjectContext
@Environment(\.presentationMode) var presentationMode

var toDoItem: ToDoItem

@State private var updatedTitle: String = "No Title"
@State private var updatedFirstName: String = "No First Name"
//more data fields

@State private var updatedDate: Date = Date()
@State private var updatedDateString: String = "July 2019"

var body: some View {
    ScrollView {
    VStack {
        Image("JohnForPosting")
            .resizable()
            .aspectRatio(contentMode: .fill)
            .frame(width: 80, height: 80)
            .clipShape(Circle())

        VStack(alignment: .leading) {
            Text("ToDo Title:")
                .padding(.leading, 5)
                .font(.headline)
            TextField("Enter a Title", text: $updatedTitle)
                .onAppear {
                    self.updatedTitle = self.toDoItem.title ?? ""
            }
            .textFieldStyle(RoundedBorderTextFieldStyle())
        }
        .padding(10)

        VStack(alignment: .leading) {
            Text("First Name:")
                .padding(.leading, 5)
                .font(.headline)
            TextField("Enter a First Name", text: $updatedFirstName)
                .onAppear {
                    self.updatedFirstName = self.toDoItem.firstName ?? ""
            }
            .textFieldStyle(RoundedBorderTextFieldStyle())
        }
        .padding(10)
        //more data fields


        VStack {
            Button(action: ({
                self.toDoItem.title = self.updatedTitle
                self.toDoItem.firstName = self.updatedFirstName
                //more data fields

                do {
                    try self.managedObjectContext.save()
                } catch {
                    print(error)
                }

                self.updatedTitle = ""
                self.updatedFirstName = ""
                //more data fields

                self.presentationMode.wrappedValue.dismiss()

            })) {
                Text("Save")
            }
            .padding()
        }
        .padding(10)
        Spacer()
    }
}
} 

Отдельный файл ToDoItemView:

var idString: String = ""
var title: String = ""
var firstName: String = ""
//more data fields

var body: some View {
    HStack {
        VStack(alignment: .leading) {
            Text("\(firstName) \(lastName)")
                .font(.headline)
            Text("\(createdAt) and \(idString)")
                .font(.caption)
        }
    }
}

Xcode 11 - Полагаю, что это настоящий выпуск (пост GM), Catalina Beta 19A558d, iOS13.1 Я думал, что изменения @Environment всегда будут вызывать перерисовку тела ContentView.И это странное поведение первого редактирования, работающего, а другие нет.Любое руководство будет оценено.

...