SwiftUI 列表选择值始终为 nil

问题描述 投票:0回答:2

我是初学者,研究了这个问题,发现它已解决,但答案不适用于我的程序。试图适应它们会导致更多无法解决的问题。 我已经将下面的代码提炼成最基本的东西。

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
    }
}
       
list swiftui selection
2个回答
0
投票

您使用了错误的修饰符。您应用于列表的

.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
    }
}

0
投票

在您的情况下,您不需要在

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
}
© www.soinside.com 2019 - 2024. All rights reserved.