SwiftUI:清除模式状态或重新初始化

mic*_*mcd 9 modal-dialog ios swift swiftui

我有一个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)
    }
}
Run Code Online (Sandbox Code Playgroud)

无论如何关闭OtherView,我都希望在清除文本状态后重新打开它,并要求OtherView可以自己打开模式。clear在OtherView结构本身上添加方法始终是一种选择,但我认为它不是可维护的方法。

以下是简化问题的视频: 演示版

Gui*_*yeC 1

9 月 11 日更新:这似乎已在 iOS 13 GM 中修复。

我一直在为同样的事情而苦苦挣扎,我想这是一个将在 9 月份解决的错误,我已经在反馈助手上提交了它,请确保这样做!

现在,您只需创建一个新的 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能想改进获取窗口的方式,特别是如果您支持多个窗口,但我认为您已经明白了。