我有一个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本身可以打开模式。在OtherView结构本身上添加clear
方法始终是一种选择,但我认为它不是可维护的方法。
答案 0 :(得分:1)
我一直在努力解决同一件事,我想这是一个将在9月解决的错误,我已经将其提交到了反馈助手中,请确保做同样的事情!
虽然现在您可以只创建一个新的UIHostingController,它包装要模态显示的SwiftUI视图。我知道它看起来确实很hacky,但至少可以起作用:
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)
}
}
您可能想改善窗口的获取方式,特别是如果您支持多个窗口,但我想您会想到的。
答案 1 :(得分:0)
您可以在.onAppear()中重新初始化模态。此示例适用于Beta 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") }
}
}
}