我正在使用 SwiftUI 构建 macOS 应用程序,并且在右键单击
List
项目时尝试删除(甚至掩盖)添加到该项目的边框。
这里是默认的:
现在右键单击并使用
contextMenu
视图修改器:
我认为这是一个
NSTableView
怪癖,所以我尝试了这三篇 Stack Overflow 帖子中的方法:
我无法让其中任何一个工作,这可能是因为我无法子类化
NSTableView
,而只能用 extension
覆盖其属性和方法。这是我到目前为止成功删除默认表格背景等的内容:
extension NSTableView{
open override func viewDidMoveToWindow() {
super.viewDidMoveToWindow()
//Remove default table styles
backgroundColor = NSColor.clear
enclosingScrollView!.drawsBackground = false
selectionHighlightStyle = .none
}
}
有什么方法可以删除 SwiftUI 中的右键单击边框吗?我什至愿意用其他视图覆盖它,但我似乎无法在表格单元格周围的空间中绘制 SwiftUI 视图。
我找到了解决这个问题的方法。我将
List
放入 ZStack
中,然后将其 opacity
设置为零。然后,我构建了同一列表的完全自定义版本,但使用 LazyVStack
:
//Message List
ZStack{
//Ghost list for keyboard control
List($model.messages, id: \.self, selection: $model.selectedMessages){ $message in
MessageItemView(message: $message)
}
.focusable()
.opacity(0)
//Custom UI for the above List
ScrollView{
ZStack{
LazyVStack(spacing: 5){
ForEach($model.messagesToday){ $message in
MessageItemView(message: $message)
}
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
每个列表都绑定到相同的模型,因此如果我单击
message
在自定义 UI 中选择它,则会在不可见的 List
中选择相同的内容。 List
中表格使用的所有键盘快捷键看起来都在自定义版本上工作。
那么这如何解决我原来的问题呢?您可以右键单击自定义
MessageItemView
,单元格周围的默认环是不可见的,但 contextMenu
仍然有效(它在我的 MessageItemView
中定义)。
这并不像我想要的那么优雅,但是对 UI 拥有 100% 的控制权,但仍然可以免费获得所有键盘控件,这很好。
你可以用这个。它将重新加载您的列表。我正在寻找另一种方法,但这有效。