我正在努力创建一个可以从 SwiftUI 应用程序中的任何位置(而不是模态)显示的 ErrorView。
问题是2秒后重置ErrorView。我有代码触发并将 errorWrapper 设置为零,但是如果用户单击按钮两次怎么办?重置将永远不会完成。
struct ContentViewContainer: View {
@State private var errorWrapper: ErrorWrapper?
var body: some View {
ContentView()
.environment(\.showError, ShowErrorAction(action: showError))
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(.green)
.overlay(alignment: .bottom, content: {
errorWrapper != nil ? ErrorView(errorWrapper: $errorWrapper) : nil
})
}
这是我的错误视图:
struct ErrorView: View {
@State private var hidden: Bool = false
@Binding var errorWrapper: ErrorWrapper?
var body: some View {
VStack {
Text(errorWrapper?.error.localizedDescription ?? "")
Text(errorWrapper?.guidance ?? "")
}
.onAppear(perform: {
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
withAnimation {
hidden = true
errorWrapper = nil // THIS WILL NOT GET CALLED WHEN THE USER TAPS MULTIPLE TIMES BUTTON
}
}
})
.foregroundStyle(.white)
.padding()
.background(.red)
.clipShape(RoundedRectangle(cornerRadius: 16.0, style: .continuous))
.opacity(hidden ? 0: 1)
}
}
这是设置 errorWrapper 的 ContentView:
struct ContentView: View {
@Environment(\.showError) private var showError
var body: some View {
VStack {
Button("Throw Error") {
showError(SampleError.operationFailed, "Operation has failed.")
}
}
.padding()
}
}
这是使用 的良好候选者
task(id:)
,只要发生更改就会触发id
并且可以取消。你会希望你的
ErrorWrapper
,你没有显示,所以我无法编辑它,是Identifiable
。您可能只需要id
在当前拥有的任何内容中添加一个即可。