如何在 SwiftUI 中使用 DisclosureGroup 作为下拉菜单?

How to use DisclosureGroup as Dropdown in SwiftUI?

我想使用 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()
                }
            }
        }
    }
}