我有一个视图,该视图从父级获取绑定Int,对其进行修改,并且如果轻按“保存”按钮,它将保存,否则返回初始值。所以我想保留原始绑定值的副本。
我尝试了很多选项,可能最好的方法似乎是下面的方法,但是如果我更改金额,副本就会发生变化
有什么想法吗?
@Binding var amount: Int
var copy: Int { $amount.value }
答案 0 :(得分:2)
以下代码可让您在视图更新中保留默认值。
注意,可能会多次创建视图,并且确保变量值在视图重新生成过程中持久存在的唯一方法是使用@State变量或对外部对象的绑定。一种选择是将两个参数传递给视图初始化程序,一个传递绑定参数,另一个传递默认值。因为您要传递默认值作为参数,所以始终可以使用它。
但是,如果您想重置绑定,我们可以做得更好,并且可以使初始化程序保留初始值的副本。为此,我们需要一个@State变量。 @State变量不能在视图主体外部进行修改,但是可以对其进行初始化。为此,您可以按照代码所示设置后备存储(_varName
)
Beta 4更改了属性包装的实现方式,更新了代码。
import SwiftUI
struct ContentView: View {
@State private var amount: Double = 10
var body: some View {
VStack {
Text("AMOUNT = \(amount)")
SubView(amount: $amount)
}
}
}
struct SubView: View {
@Binding var amount: Double
@State var defaultValue: Double
init(amount: Binding<Double>) {
// Beta 3:
// self.$amount = amount
// self.$$defaultValue = State(initialValue: amount.value)
// Beta 4:
self._amount = amount
self._defaultValue = State(initialValue: amount.value)
}
var body: some View {
VStack {
Slider(value: $amount, from: 1, through: 100, by: 10)
HStack(spacing: 20) {
Button(action: {
print("default = \(self.defaultValue)")
self.amount = self.defaultValue
}, label: {
Text("Reset")
})
Button(action: {
print("save \(self.amount)")
}, label: {
Text("Save")
})
}
}
}
}