SwiftUI: очистить модальное состояние или повторно инициализировать - PullRequest
3 голосов
/ 04 июля 2019

У меня есть модал SwiftUI, который я хотел бы очистить или повторно инициализировать.Реинитализация была бы предпочтительнее, учитывая тот факт, что этот модал может открывать другие модалы, которые могут иметь некоторое состояние.

Вот простой пример:

import SwiftUI

struct OtherView: View {
    @State var otherViewState: String = ""

    var body: some View {
        TextField($otherViewState, placeholder: Text("Demo Text Input"))
    }
}

struct Demo: View {
    @State var showModal: Bool = false

    var modal: Modal {
        Modal(OtherView(), onDismiss: { self.showModal = false })
    }

    var body: some View {
        Button(action: { self.showModal = true }) {
            Text("Toggle Modal")
        }
        .presentation(self.showModal ? self.modal : nil)
    }
}

Независимо от того, как OtherView закрывается, я быхотел бы снова открыть его с очищенным состоянием текста, с требованием, чтобы OtherView мог сам открывать модалы.Добавление метода clear в саму структуру OtherView всегда возможно, но я не считаю, что его можно обслуживать.

Ниже приведено видео с упрощенной проблемой: Demo

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Я боролся с той же вещью, и я хотел бы думать, что это ошибка, которая будет устранена к сентябрю, я уже подал ее в Feedback Assistant, обязательно сделайте то же самое!

Пока что вы можете просто создать новый UIHostingController, который оборачивает представление SwiftUI, которое вы хотите показывать модально.Я знаю, что это выглядит очень странно, но, по крайней мере, это работает:

import SwiftUI

struct OtherView: View {
    @State var otherViewState: String = ""

    var body: some View {
        TextField($otherViewState, placeholder: Text("Demo Text Input"))
    }
}

struct Demo: View {
    var body: some View {
        Button("Toggle Modal") {
            self.showModal()
        }
    }

    func showModal() {
        let window = UIApplication.shared.windows.first
        window?.rootViewController?.present(UIHostingController(rootView: OtherView()), animated: true)
    }
}

Возможно, вы захотите улучшить способ получения окна, особенно если вы поддерживаете несколько окон, но я думаю, что вы поняли идею.

0 голосов
/ 13 июля 2019

Вы можете повторно инициализировать ваш модал в .onAppear ().Этот пример работает на бета-версии 3.

import SwiftUI

struct ModalView : View {

    @Environment(\.isPresented) var isPresented: Binding<Bool>?

    @State var textName: String = ""

    var body: some View {

        NavigationView {

            Form {
                Section() {
                     TextField("Name", text: self.$textName)
                        .textFieldStyle(.roundedBorder)
                }
            }
            .listStyle(.grouped)
                .navigationBarTitle(Text("Add Name"), displayMode: .large)
                .navigationBarItems(leading: Button(action:{ self.dismiss() })
                { Text("Cancel") },
                                    trailing: Button(action:{ self.dismiss() })
                                    { Text("Save") } )
                .onAppear(perform: {
                    self.textName = ""
                })
        }
    }

    func dismiss() {
        self.isPresented?.value = false
    }

}

struct DetailView : View {

    var body: some View {

        PresentationLink(destination: ModalView())
        { Text("Present") }
    }

}

struct ContentView : View {

    var body: some View {

        NavigationView {
            NavigationLink(destination: DetailView())
            { Text("Navigate") }
        }
    }
}
...