选择器在数据更改时删除选定的段

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 来执行此操作,如果您的案例扩展,这可能会更安全一些(并且它会在您的计算属性中为您提供有限的集合)。

【讨论】:

以上是关于选择器在数据更改时删除选定的段的主要内容,如果未能解决你的问题,请参考以下文章

日期/时间选择器不提供更改的值

jQuery类选择器在类更改后不选择

矩形选择器在缩放时消失

基本的 SwiftUI 选择器在屏幕变化时发出严重警告和奇怪的动作

Ngrx - 选择器在存储更改后没有发出新值

角材料步进器在选择更改之前并防止在某些条件下进行步进更改