如何在 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 作为下拉菜单?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SwiftUI 中使用 SFSafariViewController?
如何在 SwiftUI 中使用 .fileimporter 保存音频文件并检索文件并在 SwiftUI 列表中显示它们的文件名?