Я работаю с ObservedObject
и редактирую его модально. Все редактирование и обновление ObservedObject
работает нормально, но когда я снова редактирую с помощью модального режима, он не обновляется до самого последнего состояния. Вместо этого он сохраняет последнее состояние и только до тех пор, пока я не сделаю что-то, что сбрасывает состояние внутри модального (т. Е. Введите в текстовое поле), обновляет его.
Это похоже на этот вопрос , но я использую ObservableObject
. И этот вопрос говорит, что проблема была исправлена с iOS13 GM, но я использую Xcode 11.0 (11A420a) и iOS13, и я не вижу никакого исправления.
Вот экранная запись проблемы: 
Весь приведенный ниже код был упрощен, чтобы показать проблему:
У меня есть класс Batch
, который является ObservedObject
. Я обновляю или удаляю свойство flag
с помощью модального сообщения:
class Batch: Identifiable, Codable, ObservableObject {
let id: String
private(set) var flag: String?
init(id: String, flag: String?) {
self.id = id
self.flag = flag
}
func updateFlag(flag: String?) {
guard let flag = flag else { return }
self.flag = flag
}
func removeFlag() {
self.flag = nil
}
}
Основной вид:
struct BatchView: View {
@ObservedObject var batch: Batch
@State private var showingModal = false
var body: some View {
List {
Button(action: {
self.showingModal.toggle()
}) {
Text(batch.flag ?? "No flag")
}
}
.listStyle(GroupedListStyle())
.navigationBarTitle(Text(batch.id), displayMode: .inline)
.sheet(isPresented: $showingModal) {
FlagEditView(batch: self.batch)
}
}
}
Модальное FlagEditView
:
struct FlagEditView: View {
@Environment(\.presentationMode) var mode: Binding<PresentationMode>
@ObservedObject var batch: Batch
@State private var flagText = ""
var body: some View {
NavigationView {
Form {
TextField("placeholder", text: $flagText)
Button(action: {
self.batch.removeFlag()
self.mode.wrappedValue.dismiss()
}) {
Text("Clear flag")
.foregroundColor(.red)
}
}
.navigationBarTitle("Edit Flag", displayMode: .inline)
.navigationBarItems(trailing:
Button(action: {
self.batch.updateFlag(flag: self.flagText)
self.mode.wrappedValue.dismiss()
}) {
Text("Save")
}
)
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
РЕДАКТИРОВАТЬ: Я также заметил, что .onAppear
вызывается только один раз, когда отображается модальное изображение, а затем никогда.