当前位置: 首页 > 面试题库 >

如何告诉SwiftUI视图绑定到嵌套的ObservableObjects

周浩博
2023-03-14
问题内容

我有一个SwiftUI视图,其中包含一个名为的EnvironmentObject
appModel。然后,它读取appModel.submodel.countbody方法中的值。我希望这可以将我的视图绑定到该属性countsubmodel以便在属性更新时重新呈现该属性,但这似乎没有发生。

这是一个错误吗?如果没有,将视图绑定到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 { (_) in
            self.objectWillChange.send()
        }
    } 
}

基本上,您可以AppModel捕获事件Submodel并将其发送到视图

编辑:

如果您不需要SubModel上课,则可以尝试以下方法:

struct Submodel{
    var count = 0
}

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


 类似资料:
  • 问题内容: 最后,现在有了Beta 5,我们可以以编程方式弹出到父视图。但是,在我的应用程序中,有几个地方视图都有一个“保存”按钮,该按钮可以结束几个步骤并返回到开始。在UIKit中,我使用popToRootViewController(),但是我一直无法找到在SwiftUI中执行相同操作的方法。 以下是我尝试实现的模式的简单示例。有任何想法吗? 问题答案: 设置视图调节到一个关键是让弹出到根的工

  • 我想知道如何将绑定变量向下传递到滑块视图 如果我将@State更改为@绑定,它会显示很多错误消息,如下所示 无法将“Double”类型的值转换为指定的“Binding”类型 调用中的无关参数标签“wrapedValue:” 无法推断泛型参数“V” 但是,我想让它对该变量具有@Binding,因为我将在另一个视图中使用此视图。 有什么解决办法吗?

  • 我正在创建一个asp.net页面,允许用户跨多个数据库搜索。 如果找到匹配项,我希望在主ListView中返回数据库名称。然后,我想在相应的数据库名称下,在嵌套的ListView中显示与搜索条件匹配的所有公司。 e. g.搜索:公司 后果 数据库1名称 数据库2名称 数据库3名称 如何引用和填充嵌套的ListView?

  • 最后,使用Beta 5,我们可以通过编程方式弹出到父视图。然而,在我的应用程序中有几个地方,视图有一个“保存”按钮,它结束了一个多步骤的过程并返回到开始。在UIKit中,我使用popToRootViewController(),但我无法在SwiftUI中找到同样的方法。 下面是我试图实现的模式的一个简单例子。 我该怎么做?

  • 问题内容: 我有一个带有各种 屏幕 的应用程序。每个屏幕都分配一个URL,如,,,等。 在我的主要HTML文件中,我有一个根据用户选择的路线进行更新的元素。到目前为止,一切都很好。 现在,其中一些屏幕具有子导航。例如,确实有一个收件箱和一个已发送的文件夹。他们用两列显示自己:左侧的子导航,右侧的相应文件夹的邮件。 当您导航到时,它将重定向到,因此 收件箱 基本上是 邮件 的默认子视图。 我该如何设

  • 我有一个具有各种屏幕的应用程序。每个屏幕都分配了一个URL,例如,,,等等。 在我的主HTML文件中,我有一个元素,它根据用户选择的路线进行更新。到目前为止,一切顺利。 现在这些屏幕中的一些有子导航。例如,确实有一个收件箱和一个已发送的文件夹。它们有两列:左边是子导航,右边是相应文件夹的邮件。 当您导航到时,它会将您重定向到,因此基本上收件箱是邮件的默认子视图。 我该怎么设置呢? 我目前能想到的唯