我正在用我的自定义方式初始化我的Binding值,它工作得很好,现在我想让这个自定义初始化能够影响真相的来源,我怎么可能使它发生呢?为了给你更多关于我刚才说的信息:我的BindingView控制着前门的传入值,并用一些逻辑决定动作,而这种情况发生时,我的绑定值在某种程度上无法/忘记更新真相的来源,在初始化BindingView, ContentView和BindingView有不同的价值预期!我们的目标是在初始化BindingView时放入一些代码来实现这一点,使两个视图具有相同的值。谢谢你的阅读和帮助。
import SwiftUI
struct ContentView: View {
@State private var value: Int = Int()
var body: some View {
Text("value of ContentView:" + value.description)
.padding()
Button ("update value to 0") {
value = 0
}
.padding()
Button ("update value to 1") {
value = 1
}
.padding()
BindingView(value: $value)
.padding()
}
}
struct BindingView: View {
@Binding var value: Int
init(value: Binding<Int>) {
print("initializing Binding,", "incoming value:", value.wrappedValue.description)
if value.wrappedValue == 0 {
_value = .constant(100)
}
else {
_value = value
}
}
var body: some View {
Text("value of BindingView:" + value.description)
}
}
(1)您设置绑定的方式错误。国家是真理的源泉。任何子视图绑定都应该是vanilla@Binding var whatever: Int
。
(2)如果你想让子视图以一种特殊的方式呈现绑定的数据,那么你可以简单地从父视图传递wrappedValue给子视图。子类可以有一个计算字符串变量来处理Int。但是处理数据对于视图来说是一件奇怪的事情。最好将它传递给子视图的视图模型。这可以是一个简单的结构体。在这里,你只需要一个普通的Int,没有绑定,然后处理成你想要的字符串。
(3)如果你想验证数据,使100变成0,你可能想使用一个具有@Published private(set) var value: Int = 0
和func setValue(_ new: Int)
属性的视图模型,允许你在设置发布属性之前处理值。你的视图都不应该处理如何建模数据。
(4)如果你想要一个绑定来桥接一个SwiftUI控件接受绑定的要求(例如,一个TextField),你想要如何验证数据,以及你想要如何呈现你的模型的状态,你可以在你的视图模型中做一个自定义绑定。你似乎没有遇到这种情况,所以你可以忽略它。
但是,这里有一个自定义绑定的例子,位于ObservableObject视图模型中,TabView读取并更新它。你可以在set中放入任何你想要的验证逻辑,在这种情况下,它只是将新选择映射到redux风格的存储的操作。
lazy var mode = Binding<ContrastMode> {
self.root.state.palettes.colorPickerContrast
} set: { newMode in
self.root.dispatch(.palette(.setColorPickerContrastMode(newMode)))
}