如何在 SwiftUI 中使用 DisclosureGroup 作为下拉列表?

问题描述

我想使用 disclosureGroup 作为下拉列表,让用户选择并在文本框中显示选项。我已将数组存储在模型中并检索数据。

这是我在模型中的数组

var newContents: [String] = ["Yellow","Blue","Green","White"]

这是我用于 disclosureGroup 的代码

 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()
                }
            }
        }
    }
}