从一个属性中提取价值到另一个属性中

Posted

技术标签:

【中文标题】从一个属性中提取价值到另一个属性中【英文标题】:Extract value from a property into another one 【发布时间】:2021-04-18 19:52:16 【问题描述】:

我将我的@ObservableObject 传递给子视图。由于不是每个子组件都需要来自@ObservableObject 的所有值,因此我想将某些值提取到变量中,然后将这些值用于向用户显示 UI。

假设我有一个 Data 类。

class Data: ObservableObject 
    @Published var imageName: String
    @Published var label: String
    @Published var value: String

    init(imageName: String, label: String, value: String) 
        self.imageName = imageName
        self.label = label
        self.value = value
    

现在,这就是我想要实现的目标:

struct SubView: View 
    @ObservedObject var data: Data

    @State var foo = data.value

    var body: some View 
        ZStack 
            Text(foo)
        
    

每当我尝试这样做时,编译器都会抱怨以下内容:

不能在属性初始化器中使用实例成员“数据”; 属性初始化器在“self”可用之前运行

我需要 foo 属性来拥有 @State,因为它应该是一个需要倒数到零的值。有没有办法可以绕过这个并仍然使用该值来倒计时?

【问题讨论】:

您的 Observable 对象不能包含一个变量,该变量本身就是一个 observable 对象,而是传递给子视图吗? 也许这会奏效。 data.value 只是一个抽象。就我而言,它有点嵌套在其中。也让它可观察感觉就像我只是为了这个问题而做某事。我希望应该有一个“更清洁”的解决方案.. 为什么value属性不能@Published? 该值实际上是@Published。我将编辑我的原始帖子。当示例干净时,认为它会使事情变得更容易。 那我不明白你为什么需要一个单独的@State 属性。为什么不能直接使用value 【参考方案1】:

要访问该值,只需使用data.value。您的视图代码将如下所示:

struct SubView: View 
    @ObservedObject var data: Data

    var body: some View 
        ZStack 
            Text(data.value)
        
    

但是,如果您需要获取data.valueBinding 值,您可以使用$data.value。示例:

TextField("Data value", text: $data.value)

【讨论】:

以上是关于从一个属性中提取价值到另一个属性中的主要内容,如果未能解决你的问题,请参考以下文章

Segue 不能通过使用 Outlet 属性从一个控制器传递到另一个控制器?

如何将属性从数据框复制到另一个数据框

如何将模型属性从一个 Spring MVC 控制器传递到另一个控制器?

从数组中提取嵌套属性

如何从字符串中提取熊猫索引的属性

从python中的对象列表中提取属性列表