Swiftui用户多选到对象数组



我有以下来自API的响应

"features": [
{
"name": "Safety",
"_id": "636a638959d10a2603b8d645",
"values": [
Array of String
]
},
{
"name": "Entertainment",
"_id": "636a64312bbe0cd292a1ffc6",
"values": [
Array of String
]

我解码成:

struct Feature : Codable , Hashable{
var name : String = ""
var values : [Value] = []
}
struct Value : Codable, Hashable{
var value : String = ""
var unit : String = ""
}

在视图中是这样渲染的

var body: some View {
VStack{
HStack{
Text("Choose Your Features").font(Font.body.bold())
Spacer()
}.padding(.leading, 15)
ScrollView(.vertical, showsIndicators: false){
VStack{

ForEach(Array(features.enumerated()), id: .offset) { featureIndex, feature in
HStack{
Text(feature.name).font(Font.body.bold())
Spacer()
}.padding(.bottom , 10)
ScrollView(.horizontal, showsIndicators: false){
HStack(spacing : 10){
ForEach(Array(feature.values.enumerated()), id: .offset) { valueIndex, value in

FeatureCell(isSelected: $isSelected, value: value).onTapGesture{
// here
}
}

}
Divider().padding(10)
}
}.padding(15)

}
}

}
}

用户可以从每个特征值列表中选择多个项目,现在我真的很困惑如何将这些选择存储在一个特征对象数组中,我尝试了几乎所有的东西,如数组,集合和字典,但无法达到任何解决方案。

更新:这是我要发回的json对象

{
"features": [
{
"Safety": [
"value1",
"value9",
"value3"
]
},
{
"Entertainment": [
"value7",
"value2",
"value8"
]
}
]
}

任何帮助或想法将不胜感激

您通常希望使用Set来存储已选择的项。这个集合应该是在父视图中实例化的State变量。onTapGesture闭包将向集合添加或删除值。如果FeatureCell需要知道该值是否被选中,则直接使用.contains方法。

struct FeatureValueSelectionView: View {
// The feature whose values we are displaying
let feature: Feature
// Note: You may have to manually conform Value to the Hashable protocol
@State private var selectedValues = Set<Value>()
var body: some View {
ForEach(feature.values) { value in
FeatureCell(selected: selectedValues.contains(value), value: value)
.onTapGesture { selectedValues.toggle(value) }
}
}
}

对于切换集合中的值,我喜欢使用这个简单的扩展:

extension Set {
public mutating func toggle(_ element: Element) {
if self.contains(element) {
self.subtract([element])
} else {
self.insert(element)
}
}
}

相关内容

  • 没有找到相关文章

最新更新