我有一个SwiftUI视图,其中包含一个名为appModel的EnvironmentObject.然后在body方法中读取值appModel.submodel.count.我希望这会将我的视图绑定到submodel上的属性count,以便在属性更新时重新渲染,但这似乎没有发生.

这是个窃听器吗?如果不是,将视图绑定到SwiftUI中环境对象的嵌套属性的惯用方式是什么?

具体地说,我的模型看起来是这样的...

class Submodel: ObservableObject {
  @Published var count = 0
}

class AppModel: ObservableObject {
  @Published var submodel: Submodel = Submodel()
}

我的观点是这样的...

struct ContentView: View {
  @EnvironmentObject var appModel: AppModel

  var body: some View {
    Text("Count: \(appModel.submodel.count)")
      .onTapGesture {
        self.appModel.submodel.count += 1
      }
  }
}

当我运行应用程序并单击标签时,count属性确实会增加,但标签不会更新.

我可以通过将appModel.submodel作为属性传递给ContentView来解决这个问题,但如果可能的话,我希望避免这样做.

推荐答案

嵌套模型还不能在SwiftUI中工作,但是您可以这样做

class SubModel: ObservableObject {
    @Published var count = 0
}

class AppModel: ObservableObject {
    @Published var submodel: SubModel = SubModel()
    
    var anyCancellable: AnyCancellable? = nil
    
    init() {
        anyCancellable = submodel.objectWillChange.sink { [weak self] (_) in
            self?.objectWillChange.send()
        }
    } 
}

基本上,你的AppModelSubModel捕捉事件,并将其进一步发送到View.

编辑:

如果您不需要SubModel就可以成为CLASS,那么您也可以try 这样的操作:

struct SubModel{
    var count = 0
}

class AppModel: ObservableObject {
    @Published var submodel: SubModel = SubModel()
}

Ios相关问答推荐

如何在iPhone 15上消除.NET Maui中状态栏和页面之间的差距

当重新呈现UI时,嵌套的 struct 值如何与@Observable一起工作?

如何在wiftUI中管理导航栈?

IFrame内容拒绝仅在iOS浏览器上加载-即使发布了内容-安全-策略(CSP)框架-祖先指令

SwiftUI绑定到特定的一个或多个枚举 case

如何将Safari调试器附加到Turbo-iOS原生应用中的模拟器

归档时命令 PhaseScriptExecution 失败,退出代码非零

如何使用 pushViewController 从 UIHostingController 的 SwiftUI 视图中推送 ViewController?

SKScene 的更新功能似乎不起作用

如何在 SwiftUI 中同时使用 LongPressGesture 和 ScrollView 中的滚动?

占位符文本未显示在 TextEditor 上

List touch Tabbar 时 SwiftUI Tabbar 消失

向左或向右移动时如何水平翻转sprite?

UICollectionView - 水平滚动,水平布局?

UICollectionView - 动态单元格高度?

如何在 iPhone 中为透明的 PNG 图像着色?

从 WKWebView 获取所有 cookie

如何动态计算 UILabel 高度?

正确的领域使用模式/最佳实践?

更改标签栏项目图像和文本 colored颜色 iOS