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