为什么 Picker onTap 和 onChange 不能协同工作?

Why doesn't Picker onTap and onChange work together?

提问人:user3748400 提问时间:11/15/2023 最后编辑:user3748400 更新时间:11/16/2023 访问量:48

问:

我有一个选择器(分段)。我需要onTap和onChange。onTap 有效,但 onChange 不起作用。如果我删除 tap,则只有 onChange 代码有效。

我需要两者,因为我正在预填充question.answer onAppear,因此在预填充时会触发onChange。我需要知道用户何时点击分段控件。

代码是这样的:

Picker("", selection: question.answer) {
        ForEach(yesNoOptions, id: \.self) {
            Text($0)
        }
    }
    .onTapGesture(perform: {
        //do something
    })
    .onChange(of: question.answer.wrappedValue, perform: { newValue in
        // do something
    })
    .pickerStyle(.segmented)
swiftui-picker

评论

0赞 vadian 11/16/2023
实际上,您不需要两者兼而有之。创建一个在 中设置和重置的标志。在什么都不做的时候是 .isPrefillingonAppearonChangeisPrefillingtrue

答:

0赞 JanMensch 11/15/2023 #1

您需要为分段选取器中的每个选项分配 a。否则,SwiftUI 将不知道选取器中的哪个选项对应于哪个值,因此将无法更新选择值。 为此,只需将修饰符添加到选取器中的文本视图,如下所示:tag.tag(...)

Picker("", selection: question.answer) {
    ForEach(yesNoOptions, id: \.self) {
        Text($0)
            .tag($0) // <--- indicates which value this picker option relates to
    }
}

根据您使用的数据类型,您可能还需要使其符合 ,否则将出现编译器错误。answerHashable

评论

0赞 user3748400 11/16/2023
你能请好吗?我需要如何在第一次点击选择器段时发出警报。但我需要 onChange 来更新选定的答案。我不确定标签将如何提供帮助。
0赞 JanMensch 11/16/2023
问问自己,如果用户通过选取器进行选择,选取器实际上如何知道要存储什么值?SwiftUI 只能看到“文本”视图。您需要告诉它每个选择选项所引用的值。为此,您使用 .一旦你有了它,SwiftUI 就会看到“啊,用户选择了那个视图,它与该值相关,所以我会取该值并将其存储在答案中”。然后,随着答案值的变化,您将在 中得到一个事件。Text($0)question.answer.tag()onChange()