如何保留原始绑定值的副本

时间:2019-07-16 15:34:23

标签: swiftui

我有一个视图,该视图从父级获取绑定Int,对其进行修改,并且如果轻按“保存”按钮,它将保存,否则返回初始值。所以我想保留原始绑定值的副本。

我尝试了很多选项,可能最好的方法似乎是下面的方法,但是如果我更改金额,副本就会发生变化

有什么想法吗?

@Binding var amount: Int
var copy: Int { $amount.value }

1 个答案:

答案 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")
                })
            }
        }
    }
}