为什么在使用SwiftUI时,选择器绑定不会更新?

4

我刚开始学习Swift(甚至是Swift UI!),所以如果出现新手错误,敬请谅解。

我正在尝试编写一个非常简单的程序,在这个程序中,用户从选择器中选择某个人的名字,然后在下面看到显示该人的问候语的文本。

但是,当使用选择器选取一个新值时,绑定变量chosenPerson不会更新。这意味着即使我选择了一个人,也会显示“Hello no-one”,而不是像“Hello Harry”这样的问候语。


struct ContentView: View {

var people = ["Harry", "Hermione", "Ron"]
@State var chosenPerson: String? = nil

    var body: some View {
        NavigationView {
            Form {
        Section {
    Picker("Choose your favourite", selection: $chosenPerson) {
        ForEach ((0..<people.count), id: \.self) { person in
            Text(self.people[person])
            }
        }
        }

        Section{
            Text("Hello \(chosenPerson ?? "no-one")")
        }
        }
    }
   }
}

我看了一下这个问题,似乎有点类似但是在Text(self.people[person])中添加.tag(person)并没有解决我的问题。

我如何才能让问候语显示所选人的名字?

2个回答

16

将绑定到索引,而不是字符串。使用选择器时,您不会执行任何会更改字符串的操作!当选择器更改时,发生更改的是所选索引。

struct ContentView: View {
    var people = ["Harry", "Hermione", "Ron"]
    @State var chosenPerson = 0
    var body: some View {
        NavigationView {
            Form {
                Section {
                    Picker("Choose your favourite", selection: $chosenPerson) {
                        ForEach(0..<people.count) { person in
                            Text(self.people[person])
                        }
                    }
                }
                Section {
                    Text("Hello \(people[chosenPerson])")
                }
            }
        }
    }
}

在此输入图片描述


谢谢。我以为是值的问题,因此类型错误,它总是返回0.0。现在我只是将类型从Double更改为Int,然后它就可以工作了。 - William Tong

1

如果您使用的是简单数组,则接受的答案是正确的,但对于我来说并不起作用,因为我正在使用自定义模型结构的数组,并且已定义为字符串的ID,在这种情况下,选择必须与此ID的类型相同。 例如:

struct CustomModel: Codable, Identifiable, Hashable{

var id: String // <- ID of type string
var name: String
var imageUrl: String

然后,当你要使用选择器时:

struct UsingView: View {

@State private var chosenCustomModel: String = "" //<- String as ID
@State private var models: [CustomModel] = []


var body: some View {
 
        VStack{
            
                Picker("Picker", selection: $chosenCustomModel){
                        ForEach(models){ model in
                            Text(model.name)
                                .foregroundColor(.blue)
                        }
                    }
                }

希望对某些人有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接