选择器在数据更改时删除选定的段
Posted
技术标签:
【中文标题】选择器在数据更改时删除选定的段【英文标题】:Picker drops selected segment when data changed 【发布时间】:2021-03-13 15:29:58 【问题描述】:我遇到了 Picker 的问题。当我尝试更改选定段中的数据状态时,它会丢弃它(附有 gif)。更改显示数据时如何在选择器中保持选定段(当我按下“爱”按钮时,选定段应该保持不变)
单项有选项:
struct Landmark: Identifiable, Codable, Hashable
var id: Int
var name: String
var imageName: String
var mainImage: Image
Image(imageName)
var liked: Bool
var popular: Bool
var recommended: Bool
我得到了包含对象数组的类:
final class ModelData: ObservableObject
@Published var landmarks: [Landmark]
并尝试像这样使用选择器:
struct tempSegmentControl: View
@EnvironmentObject var modelData: ModelData
@State private var selected = ModelData().landmarks
var popularLandmarks: [Landmark]
modelData.landmarks.filter landmark in
(landmark.popular)
var rocommendedLandmarks: [Landmark]
modelData.landmarks.filter landmark in
(landmark.recommended)
var body: some View
VStack
Picker("Selection", selection: $selected)
Text("All").tag(modelData.landmarks)
Text("Popular").tag(popularLandmarks)
Text("Recommended").tag(rocommendedLandmarks)
.pickerStyle(SegmentedPickerStyle())
.frame(width: UIScreen.main.bounds.width * 0.95)
ForEach(selected, id: \.id) land in
NavigationLink(
destination: DetailView2(landmark: land))
MainItem3(landmark: land)
Drop selected segment
【问题讨论】:
【参考方案1】:selection:
无法与这样的数组类型 ([Landmark]
) 一起正常工作。
相反,您可能想做一些简单的事情,例如:
@State private var selection = 0
//...
Picker("Selection", selection: $selection)
Text("All").tag(0)
Text("Popular").tag(1)
Text("Recommended").tag(2)
然后为您的数组使用计算属性,以便您稍后迭代:
var selected : [Landmark]
switch selection
case 0:
return modelData.landmarks
case 1:
//etc
您也可以使用 enum : Int
来执行此操作,如果您的案例扩展,这可能会更安全一些(并且它会在您的计算属性中为您提供有限的集合)。
【讨论】:
以上是关于选择器在数据更改时删除选定的段的主要内容,如果未能解决你的问题,请参考以下文章