Модальное состояние SwiftUI не сбрасывается с помощью ObservableObject - PullRequest
0 голосов
/ 08 октября 2019

Я работаю с ObservedObject и редактирую его модально. Все редактирование и обновление ObservedObject работает нормально, но когда я снова редактирую с помощью модального режима, он не обновляется до самого последнего состояния. Вместо этого он сохраняет последнее состояние и только до тех пор, пока я не сделаю что-то, что сбрасывает состояние внутри модального (т. Е. Введите в текстовое поле), обновляет его.

Это похоже на этот вопрос , но я использую ObservableObject. И этот вопрос говорит, что проблема была исправлена ​​с iOS13 GM, но я использую Xcode 11.0 (11A420a) и iOS13, и я не вижу никакого исправления.

Вот экранная запись проблемы: enter image description here

Весь приведенный ниже код был упрощен, чтобы показать проблему:

У меня есть класс 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 вызывается только один раз, когда отображается модальное изображение, а затем никогда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...