swift ViewModifier对更改做出React-通用吐司警报

rjee0c15  于 2023-04-10  发布在  Swift
关注(0)|答案(1)|浏览(116)

我正在使用吐司库来显示错误或成功警报。
对于一般的,我不想写所有的代码在很多地方,所以我试图创建一个通用的视图修饰符.

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中添加@ObservedObjectactionCompletedViewModel。不工作

编辑2:

  • 我创建了一个项目来说明我的问题repo
eivnm1vs

eivnm1vs1#

在SwiftUI中,属性 Package 器(如@StateObject@ObservedObject)通常用于注解引用类型(如ObservableObject),并告诉View它应该监视该对象的更新。
如果没有这些 Package 器,View(或本例中的ViewModifier)就不会收到应该重新计算/重新呈现的通知。
在您的示例中,您需要在两个var actionCompletedViewModel: ActionCompletedViewModel声明之前添加@ObservedObject

相关问题