问题描述
我想使用 disclosureGroup 作为下拉列表,让用户选择并在文本框中显示选项。我已将数组存储在模型中并检索数据。
这是我在模型中的数组
var newContents: [String] = ["Yellow","Blue","Green","White"]
HStack{
Text("Select : ")
disclosureGroup("\(Myviewmodel.MyModel.newContents[0])",isExpanded: $isScollExpanded){
ScrollView {
vstack(alignment: .leading,spacing: 8){
ForEach(Myviewmodel.MyModel. newContents,id: \.self){ index in
Text("\(index)")
.onTapGesture {
self.Myviewmodel.MyModel.newContents[0] = index
withAnimation{
self.isScollExpanded.toggle()
}
}
}
}.padding()
}
}
}
这段代码的工作原理是,当我选择一个选项时,它会重复两次,并且缺少数组中的第一个字符串。任何人都可以帮我解决这个问题吗?
解决方法
代替或更改第一项,您可以为 selection
设置一个变量。更改 DisclosureGroup
标题并在点击时更改 selection
,如下所示。数据不再变异,只是选择发生了变化。
以下内容可以解决您的问题:
class MyModel: ObservableObject {
@Published var selection = "Yellow"
private let newContents: [String] = ["Yellow","Blue","Green","White"]
}
struct ContentView: View {
@State private var isScrollExpanded = false
//
var body: some View {
HStack{
Text("Select : ")
DisclosureGroup(MyViewModel.MyModel.selection,isExpanded: isScrollExpanded) {
ScrollView {
VStack(alignment: .leading,spacing: 8) {
ForEach(MyViewModel.MyModel.newContents,id: \.self) { str in
Text("\(str)")
.onTapGesture {
MyViewModel.MyModel.selection = str
withAnimation{
isScrollExpanded.toggle()
}
}
}
}.padding()
}
}
}
}
}