删除 SwiftUI Mac 应用程序列表中右键单击行的大纲

问题描述 投票:0回答:3

我正在使用 SwiftUI 构建 macOS 应用程序,并且在右键单击

List
项目时尝试删除(甚至掩盖)添加到该项目的边框。

这里是默认的:

现在右键单击并使用

contextMenu
视图修改器:

我认为这是一个

NSTableView
怪癖,所以我尝试了这三篇 Stack Overflow 帖子中的方法:

  1. 在基于视图的 NSTableView 上自定义右键高亮
  2. 带有菜单的NSTableView,如何右键更改边框颜色?
  3. 禁用 NSTableView 行聚焦环
  4. NSTableView:右键单击行上的蓝色轮廓

我无法让其中任何一个工作,这可能是因为我无法子类化

NSTableView
,而只能用
extension
覆盖其属性和方法。这是我到目前为止成功删除默认表格背景等的内容:

extension NSTableView{
  open override func viewDidMoveToWindow() {
    super.viewDidMoveToWindow()

    //Remove default table styles
    backgroundColor = NSColor.clear
    enclosingScrollView!.drawsBackground = false
    selectionHighlightStyle = .none
  }
}

有什么方法可以删除 SwiftUI 中的右键单击边框吗?我什至愿意用其他视图覆盖它,但我似乎无法在表格单元格周围的空间中绘制 SwiftUI 视图。

swiftui nstableview swiftui-list nstableviewcell nstablerowview
3个回答
1
投票

我找到了解决这个问题的方法。我将

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% 的控制权,但仍然可以免费获得所有键盘控件,这很好。

    


0
投票
你可以用这个。它将重新加载您的列表。我正在寻找另一种方法,但这有效。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.