У меня есть простое приложение 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.И это странное поведение первого редактирования, работающего, а другие нет.Любое руководство будет оценено.