【问题标题】:List Item with Picker (segmented control) subview and selection gesture带有选取器(分段控件)子视图和选择手势的列表项
【发布时间】:2021-03-07 13:02:40
【问题描述】:

我有一个包含 Picker 视图(分段控制样式)的列表和项目。我想分别处理选择和选择器状态。未选择列表项时应禁用选择器。

问题是:

  • 第一次点击 - 选择列表项。 (选定 = 真)
  • 点击选择器 - 设置选择 = false

在 UIKit 上,Button/SegmentControl/etc...抓住“点击”,不要进入 TableView 选择状态。

struct ListView: View {
    @State var selected = Set<Int>()
    let items = (1...10).map { ItemDataModel(id: $0) }
    
    var body: some View {
        List(items) { item in
            ListItemView(dataModel: item)
                .onTapGesture { if !(selected.remove(item.id) != .none) { selected.insert(item.id) }}
        }
    }
}

struct ListItemView: View {
    @ObservedObject var dataModel: ItemDataModel
    
    var body: some View {
        let pickerBinding = Binding<Int>(
            get: { dataModel.state?.rawValue ?? -1 },
            set: { dataModel.state = DataState(rawValue: $0) }
        )
        HStack {
            Text(dataModel.title)
            Spacer()
            Picker("sdf", selection: pickerBinding) {
                Text("State 1").tag(0)
                Text("State 2").tag(1)
                Text("State 3").tag(2)
            }.pickerStyle(SegmentedPickerStyle())
        }
    }
}


enum DataState: Int {
    case state1, state2, state3
}

class ItemDataModel: Hashable, Identifiable, ObservableObject {
    let id: Int
    let title: String
    @Published var state: DataState? = .state1
    
    init(id: Int) {
        self.id = id
        title = "item \(id)"
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(title)
    }
    
    static func == (lhs: ItemDataModel, rhs: ItemDataModel) -> Bool {
        return lhs.id == rhs.id
    }
}

[请尝试忽略语法错误(如果存在)并专注于手势问题]

【问题讨论】:

    标签: ios swift swiftui swiftui-list


    【解决方案1】:

    一种可能的解决方案是仅在未选择 Picker 时应用修饰符:

    struct ListView: View {
        @State var selected = Set<Int>()
        let items = (1 ... 10).map { ItemDataModel(id: $0) }
    
        var body: some View {
            List(items) { item in
                if selected.contains(item.id) {
                    ListItemView(dataModel: item)
                } else {
                    ListItemView(dataModel: item)
                        .disabled(true)
                        .onTapGesture {
                            if !(selected.remove(item.id) != .none) {
                                selected.insert(item.id)
                            }
                        }
                }
            }
        }
    }
    

    【讨论】:

    • 场景:当项目被“选中”并且我希望更改选择器上的选择时。结果:项目未被选中,而不是通过 Picker 更改状态枚举。我不明白你的建议如何解决这个问题
    • @gutte 我不确定我是否了解您的需求。您能否更清楚地描述您的问题 - 可能将所有场景添加到问题中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2014-01-23
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多