带有选取器(分段控件)子视图和选择手势的列表项
Posted
技术标签:
【中文标题】带有选取器(分段控件)子视图和选择手势的列表项【英文标题】: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
[请尝试忽略语法错误(如果存在)并专注于手势问题]
【问题讨论】:
【参考方案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 我不确定我是否了解您的需求。您能否更清楚地描述您的问题 - 可能将所有场景添加到问题中?以上是关于带有选取器(分段控件)子视图和选择手势的列表项的主要内容,如果未能解决你的问题,请参考以下文章