如何解决带有选择器分段控件子视图和选择手势的列表项
我有一个 List 和包含 Picker 视图(分段控制麦粒肿)的项目。我想分别处理选择和选择器状态。未选择列表项时应禁用选择器。
问题是:
- 第一次点击 - 选择列表项。 (选择 = 真)
- 点击选择器 - 设置选择 = false
在 UIKit、Button/SegmentControl/等上...抓住“点击”,不要进入 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
}
}
[请尽量忽略语法错误(如果存在)并专注于手势问题]
解决方法
一种可能的解决方案是仅在未选择 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)
}
}
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。