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

Posted

技术标签:

【中文标题】如何在 SwiftUI 中使用 DisclosureGroup 作为下拉菜单?【英文标题】:How to use DisclosureGroup as Dropdown in SwiftUI? 【发布时间】:2021-02-04 14:52:44 【问题描述】:

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

此代码的工作方式类似于,当我选择一个选项时,它会重复两次并且数组中的第一个字符串丢失。谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

您可以使用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()
                
            
        
    

【讨论】:

非常感谢您的回答。但我想从我的模型中获取这个数组和选择。你能帮我实现吗? @gamedi3060 你的意思有点不清楚。你可以从你的模型中得到newContents,我就是这样做的,所以我可以运行它,因为我没有你的MyViewModel 和代码。如果你愿意,你也可以在那里存储selection 非常感谢,现在我明白了这个概念,它解决了所有问题! @gamedi3060 现在编辑它,希望更有意义。很高兴它现在可以工作了!

以上是关于如何在 SwiftUI 中使用 DisclosureGroup 作为下拉菜单?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIkit 中添加 SwiftUI 对象

如何在 SwiftUI 中使用 SFSafariViewController?

如何在 swiftUI 视图中使用按钮? [关闭]

如何在 SwiftUI 中使用 .fileimporter 保存音频文件并检索文件并在 SwiftUI 列表中显示它们的文件名?

如何在 Xcode Playground 中使用 SwiftUI?

如何在 SwiftUI 中使用渐变填充形状