我正在使用吐司库来显示错误或成功警报。
对于一般的,我不想写所有的代码在很多地方,所以我试图创建一个通用的视图修饰符.
struct ErrorToast: ViewModifier {
let actionCompletedViewModel: ActionCompletedViewModel
func body(content: Content) -> some View {
content
.toast(isPresenting: .constant(actionCompletedViewModel.error != nil), duration: 2, tapToDismiss: true,
alert: {
let errorMessage = actionCompletedViewModel.error?.errorDescription
let errorTitle = actionCompletedViewModel.error?.title
return AlertToast(displayMode: .alert, type: .error(.red), title: errorTitle, subTitle: errorMessage)
}, onTap: {
actionCompletedViewModel.handleErrorAndClear()
})
}
}
ActionCompletedViewModel
是一个被所有视图模型继承的类
class ActionCompletedViewModel: ObservableObject {
@Published var error: CustomError?
@Published var success: CustomSuccess?
func assignError(error: CustomError) {
DispatchQueue.main.async {[weak self] in
self?.error = error
}
}
....
}
在我的视图结构中,我简单地附加修饰符
struct AView: View {
@ObservedObject var aViewModel = AVIEWModel.shared
var body: some View {
VSTack {
Button {
aViewModel.doAction()
}
}
.errorToast(aViewModel: aViewModel)
}
}
class AViewModel: ActionCompletedViewModel, ObservableObject {
func doAction() {
someOtherAction() { result in
DispatchQueue.main.async {
switch result {
case .success(let success): self.assignSuccess(sucess: success)
case .failure(let error): self.assignError(error: error)
}
}
}
}
}
问题是吐司没有显示,它没有对错误字段分配错误做出React
场景:如果我在屏幕A上,然后转到屏幕B,执行一个操作,错误被抛出-错误警报不显示-我回到A,然后回到B,错误警报显示-这告诉我错误变量被正确分配,渲染是静态完成的
Github gist with the code
编辑:
- 尝试在ErrorToast中添加
@ObservedObject
到actionCompletedViewModel
。不工作
编辑2:
- 我创建了一个项目来说明我的问题repo
1条答案
按热度按时间eivnm1vs1#
在SwiftUI中,属性 Package 器(如
@StateObject
和@ObservedObject
)通常用于注解引用类型(如ObservableObject
),并告诉View
它应该监视该对象的更新。如果没有这些 Package 器,
View
(或本例中的ViewModifier
)就不会收到应该重新计算/重新呈现的通知。在您的示例中,您需要在两个
var actionCompletedViewModel: ActionCompletedViewModel
声明之前添加@ObservedObject
。