我是初学者,研究了这个问题,发现它已解决,但答案不适用于我的程序。试图适应它们会导致更多无法解决的问题。 我已经将下面的代码提炼成最基本的东西。
How do I get a List selection value to write into my Textfield, tf1 when the selection value is always nil?
是否有适用于我的目标的修复、解决方法或其他方法?
import SwiftUI
var d1:[String:[String]] = [
"energy":["heat","kinetic","light"],
"matter":["gas","liquid","solid"],
"space":["1dim","2dim","3dim"],]
struct ContentView: View {
@State var cpo = Array(d1.keys).sorted()
@State var tf1: String = "matter"
@State var selection: String?
var body: some View {
VStack {
TextField("tf1", text: $tf1)
List(cpo, id: \.self, selection: $selection) {
i in Text(i)
}
.onTapGesture {
tf1 = selection!
}
} //VS
}
}
您使用了错误的修饰符。您应用于列表的
.onTapGesture
将在您单击列表时立即触发。它将阻止 List
中的每个选择,并会尝试强制打开您的 selection
var。 selection
将在那时为零导致崩溃。
更好:
使用
.onChange
修饰符作用于selection
的变化。如果新值为 nil,请提供适当的替代方案。我在这里使用了一个空字符串。
import SwiftUI
var d1:[String:[String]] = [
"energy":["heat","kinetic","light"],
"matter":["gas","liquid","solid"],
"space":["1dim","2dim","3dim"],]
struct ContentView: View {
@State var cpo = Array(d1.keys).sorted()
@State var tf1: String = "matter"
@State var selection: String?
var body: some View {
VStack {
TextField("tf1", text: $tf1)
List(cpo, id: \.self, selection: $selection) {i in
Text(i)
}
.onChange(of: selection) { newValue in
tf1 = newValue ?? ""
}
} //VS
}
}
在您的情况下,您不需要在
List
中进行选择-您可以直接更改tf1
的值。但是.onTapGesture
必须应用于Text
,而不是List
。
代码如下:
@State var cpo = Array(d1.keys).sorted()
@State var tf1: String = "matter"
var body: some View {
VStack {
TextField("tf1", text: $tf1)
List(cpo, id: \.self) { i in
Text(i)
.onTapGesture {
tf1 = i
}
}
} //VS
}