只需一次点击即可从MacOS上的SwiftUI列表中取消选择项目

编程入门 行业动态 更新时间:2024-10-25 20:21:24
本文介绍了只需一次点击即可从MacOS上的SwiftUI列表中取消选择项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在开发一个带有List带有可选行的视图的MacOS应用程序。 因为很遗憾没有editMode

在MacOS上,可以单击选择单元格,但取消选择执行相同操作的已选择单元格不会产生任何影响。 取消选择单元格的唯一选项是CMD + Click,这不是很直观。 最小示例:

struct RowsView: View { @State var selectKeeper: String? let rows = ["1", "2", "3", "4", "5", "6", "7", "8"] var body: some View { List(rows, id: .self, selection: $selectKeeper) { row in Text(row) } } } struct RowsView_Previews: PreviewProvider { static var previews: some View { RowsView() } }

单击或甚至双击第3行不执行任何操作,并且该行保持选中状态。

直接绑定 我已尝试按照Pickerhere的出色答案中所述直接附加Binding,但这似乎不适用于MacOS上的List:

... var body: some View { List(rows, id: .self, selection: Binding($selectKeeper, deselectTo: nil)) { row in Text(row) } } ... public extension Binding where Value: Equatable { init(_ source: Binding<Value>, deselectTo value: Value) { self.init(get: { source.wrappedValue }, set: { source.wrappedValue = $0 == source.wrappedValue ? value : $0 } ) } }

关于如何在不重建选择机制的情况下实现单击取消选择,您有什么想法吗?

记录:Xcode 13.2.1,MacOS BigSur 11.6.2

推荐答案

我们可以使用自己的手势阻止默认的点击处理,并手动管理选择。

这里是可能的方法的演示。在Xcode 13.2/MacOS 12.1上测试

struct RowsView: View { @State var selectKeeper: String? let rows = ["1", "2", "3", "4", "5", "6", "7", "8"] var body: some View { List(rows, id: .self, selection: $selectKeeper) { row in Text(row) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading) .contentShape(Rectangle()) // handle click row-wide .listRowInsets(EdgeInsets()) // remove default edges .onTapGesture { selectKeeper = selectKeeper == row ? nil : row // << here !! } .padding(.vertical, 4) // look&feel like default } } }

更多推荐

只需一次点击即可从MacOS上的SwiftUI列表中取消选择项目

本文发布于:2023-11-28 22:40:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1644229.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:只需   项目   列表中   SwiftUI   MacOS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!