【问题标题】:Remove Outline on Right-clicked Rows in SwiftUI Mac App List删除 SwiftUI Mac 应用程序列表中右键单击行上的轮廓
【发布时间】:2022-03-09 23:40:47
【问题描述】:

我正在使用 SwiftUI 构建一个 macOS 应用程序,当我右键单击它时,我正在尝试删除(甚至掩盖)添加到 List 项目的边框。

默认情况下,这里是:

现在通过右键单击和 contextMenu 视图修饰符:

我认为这是一个 NSTableView 怪癖,所以我尝试了以下三个 Stack Overflow 帖子中的方法:

  1. Customize right click highlight on view-based NSTableView
  2. NSTableView with menu, how to change the border color with right click?
  3. Disabling the NSTableView row focus ring
  4. NSTableView: blue outline on right-clicked rows

    我无法让其中任何一个工作,这可能是因为我不能子类化NSTableView,而只能用extension 覆盖它的属性和方法。到目前为止,这是我成功删除默认表格背景等的内容:

    extension NSTableView{
      open override func viewDidMoveToWindow() {
        super.viewDidMoveToWindow()
    
        //Remove default table styles
        backgroundColor = NSColor.clear
        enclosingScrollView!.drawsBackground = false
        selectionHighlightStyle = .none
      }
    }
    

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

  • 你能找到解决方案吗?
  • @EuanTraynor 我找到了一种解决方法。我将它作为答案发布,因为它包含一些代码。

标签: swiftui nstableview swiftui-list nstableviewcell nstablerowview


【解决方案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)

每个列表都绑定到同一个模型,所以如果我在自定义 UI 中单击 message 来选择它,那么在不可见的 List 中会选择相同的东西。 List 中的表格使用的所有键盘快捷键看起来都在使用自定义版本。

那么这如何解决我原来的问题呢?您可以右键单击自定义MessageItemView,单元格周围的默认环是不可见的,但contextMenu 仍然有效(它在我的MessageItemView 中定义)。

这并不像我想要的那样优雅,但是对 UI 有 100% 的控制权,但仍然可以通过 List 免费获得所有键盘控件,这真是太好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2017-10-13
    相关资源
    最近更新 更多