【问题标题】:Preventing contextual menu showing on specific cell in a view based NSTableView防止上下文菜单显示在基于视图的 NSTableView 中的特定单元格上
【发布时间】:2017-02-27 14:01:21
【问题描述】:

是否有任何方法可以防止在基于视图的NSTableView右键单击特定单元格时显示上下文菜单(以及单元格视图周围的相关选择“环”) ?

我说的不是在所有单元格上禁用右键单击操作,而是在特定单元格上禁用。

我显然已经尝试了所有处理选择更改的委托方法,但没有一个有效,因为selectedRow 属性没有改变,只有clickedRow 会改变。 所以基本上我正在寻找相当于

func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool 

但对于 clicked 行而不是 selected 行。

注意:问题是关于 ma​​cOS 上的 NSTableView 而不是 iOS 上的 UITableView

【问题讨论】:

    标签: objective-c swift macos cocoa nstableview


    【解决方案1】:

    我找到了一种方法来做我想做的事,虽然看起来有点涉及到应该更简单的事情。所以我欢迎任何更简单的解决方案。

    可以通过继承 NSTableView 来完成:

    class MyTableView : NSTableView {
    
        override func menu(for event: NSEvent) -> NSMenu? {
            let clickedPoint = self.convert(event.locationInWindow, from: nil)
            let row = self.row(at: clickedPoint)
    
            // no contextual menu for the last row
            return row == self.numberOfRows - 1 ? nil : super.menu(for: event)
        }
    } 
    

    此示例阻止在最后一行显示上下文菜单,但可以通过添加一个具有返回每个单元格的菜单方法的委托来实现更通用的解决方案。

    【讨论】:

      【解决方案2】:

      与继承 NSTableView 不同,一种更简单的方法是设置菜单委托并删除 public func menuNeedsUpdate(_ menu: NSMenu) 委托方法中的所有项目。

      例子:

      class MyViewController: NSViewController  {
      
          override func viewDidLoad() {
              let menu = NSMenu()
              menu.delegate = self
      
              tableView.menu = menu
          }
      
      }
      
      
      extension MyViewController: NSMenuDelegate  {
      
          public func menuNeedsUpdate(_ menu: NSMenu) {
              //This will prevent menu from showing
              menu.removeAllItems()
      
              //Check if user has clicked on the cell or somewhere inside tableView 
              //area that is not populated with cells
              guard tableView.clickedRow >= 0 else { return }
      
              //Get model
              let item = items[tableView.clickedRow]
      
              //For cells that need context menu, add necessary menu items
              if item.needsContextMenu {
                  menu.addItem(NSMenuItem(title: "Edit", action: #selector(tableViewEditItemClicked(_:)), keyEquivalent: "e"))
                  menu.addItem(NSMenuItem(title: "Delete", action: #selector(tableViewEditItemClicked(_:)), keyEquivalent: "d"))
              }
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-05
        • 1970-01-01
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-17
        相关资源
        最近更新 更多