如何在SwiftUI中添加两个文本字段的值?
我有这个代码:
import SwiftUI
struct ContentView: View {
@State private var value1 = ""
@State private var value2 = ""
private var sumValues = (Int(value1) ?? 0) + (Int(value2) ?? 0)
var body: some View {
VStack {
TextField("type value 1 here", text: $value1)
.keyboardType(.numberPad)
TextField("type value 2 here", text: $value2)
.keyboardType(.numberPad)
Text("sum: (sumValues)")
// I need to have a var or let, so I cannot use something like this:
//Text("sum: ((Int(value1) ?? 0) + (Int(value2) ?? 0))")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我在private var sumValues中得到了这个错误:
无法在属性初始值设定项中使用实例成员"value1";属性初始化程序在"self"可用之前运行
无法在属性初始值设定项中使用实例成员"value2";属性初始化程序在"self"可用之前运行
使用computed-property
。
private var sumValues: Int { (Int(value1) ?? 0) + (Int(value2) ?? 0) }
可能的方法是将所有这些逻辑(可能是所有其他逻辑(移动到视图模型中,如下所示-因此保持引擎与视图分离,并让标准观察到的动态属性负责视图更新:
这是一个简单的演示。使用Xcode 12/iOS 14 进行测试
class CalcViewModel: ObservableObject {
@Published var value1 = "" {
didSet { update() }
}
@Published var value2 = "" {
didSet { update() }
}
@Published var sum: Int = 0
private func update() {
self.sum = (Int(value1) ?? 0) + (Int(value2) ?? 0)
}
}
struct ContentView: View {
@ObservedObject var vm = CalcViewModel()
var body: some View {
VStack {
TextField("type value 1 here", text: $vm.value1)
.keyboardType(.numberPad)
TextField("type value 2 here", text: $vm.value2)
.keyboardType(.numberPad)
Text("sum: (vm.sum)")
}
}
}
我认为您可以将sumValues
更改为计算属性:
private var sumValues: Int {
get {
(Int(value1) ?? 0) + (Int(value2) ?? 0)
}
}