我想通过a @State的init()方法在SwiftUI中初始化var 的值Struct,以便它可以从准备好的字典中获取适当的文本以用于TextField中的操作。源代码如下所示:
struct StateFromOutside: View {
let list = [
"a": "Letter A",
"b": "Letter B",
// ...
]
@State var fullText: String = ""
init(letter: String) {
self.fullText = list[letter]!
}
var body: some View {
TextField($fullText)
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是执行失败并显示错误 Thread 1: Fatal error: Accessing State<String> outside View.body
我该如何解决?提前非常感谢您!
Kev*_*vin 25
SwiftUI不允许您更改 @State初始值设定项,但可以对其进行初始化。
删除默认值,并使用_fullText它@State直接进行设置,而不用通过属性包装器访问器。
@State var fullText: String // No default value of ""
init(letter: String) {
_fullText = State(initialValue: list[letter]!)
}
Run Code Online (Sandbox Code Playgroud)
Val*_*adu 20
最重要的答案是一种反模式,当依赖项发生变化 ( letter) 并且您的状态不会相应更新时,它会在以后带来痛苦。
永远不应该使用State(initialValue:)或State(wrappedValue:)初始化 a 中的View状态init。事实上,State应该只内联初始化,如下所示:
@State private var fullText: String = "The value"
Run Code Online (Sandbox Code Playgroud)
如果这不可行,请使用@Binding、 、和@ObservedObject之间的组合,甚至是自定义@Binding@StateDynamicProperty
更多相关信息请参见此处。
我会尝试将其初始化onAppear。
struct StateFromOutside: View {
let list = [
"a": "Letter A",
"b": "Letter B",
// ...
]
@State var fullText: String = ""
var body: some View {
TextField($fullText)
.onAppear {
self.fullText = list[letter]!
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者,甚至更好的是,使用模型对象(BindableObject链接到您的视图)并在那里执行所有初始化和业务逻辑。您的视图将更新以自动反映更改。
| 归档时间: |
|
| 查看次数: |
1118 次 |
| 最近记录: |