从一个属性中提取价值到另一个属性中
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.value
的Binding
值,您可以使用$data.value
。示例:
TextField("Data value", text: $data.value)
【讨论】:
以上是关于从一个属性中提取价值到另一个属性中的主要内容,如果未能解决你的问题,请参考以下文章
Segue 不能通过使用 Outlet 属性从一个控制器传递到另一个控制器?