【问题标题】: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

【问题讨论】:

    标签: swiftui observable picker


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

    【讨论】:

      猜你喜欢
      • 2019-01-07
      • 2012-12-07
      • 2012-06-03
      • 2017-01-07
      • 2023-03-09
      • 2014-01-29
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      相关资源
      最近更新 更多