NSTableView Указатель правой кнопкой мыши по строке

я ищу способ получить щелчок правой кнопкой мыши индекс строки изNSTableView Но я могу'не найти для него никаких методов делегатов или атрибутов класса. Любое предложение приветствуется.

Ответы на вопрос(5)

но нужно знатьдействие правой кнопкой мыши с номером строки "Я думаю, что самый простой способ ниже. (Код Swift4)не нужен какой-либо другой связанный класс Outer NSMenu.

class SomeViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {
  @IBOutlet weak var tableView: NSTableView!
  ...

  override func viewDidLoad() {
    ...
    tableView.action = #selector(some method()) // left single click action
    tableView.doubleAction = #selector(someMethod()) // left double click action
  }

  // right click action
  override func rightMouseDown(with theEvent: NSEvent) {
    let point = tableView.convert(theEvent.locationInWindow, from: nil)
    let row = tableView.row(at: point)
    print("right click")
    print(row)
  }

NSTableView метод- (NSInteger)clickedRow чтобы получить индекс последней нажатой строки. Возвращенный NSInteger будет индексом строки, нажатой правой кнопкой мыши.

Вам не нужно подклассNSTableView для этого решения.clickedRow также доступен на.NSOutlineView

 Kirkova21 мая 2019 г., 23:31
@MichaelTsai, этот комментарий является ключевым для меня. Я должен был использоватьmenu выход. Просто создаю и возвращаюNSMenu() в коде не обновлялclickedRow значение
 Borzh19 окт. 2017 г., 20:56
Спасибо, это самый простой ответ для реализации.
 Giles12 февр. 2018 г., 16:03
Этот ответ работает правильно. Установите NSTableView 'Свойство меню для элемента NSMenu, которым вы владеете. Установить, что NSMenu 'с делегатом. В menuNeedsUpdate (_: NSMenu) вы можете вызвать clickedRow () для NSTableView. Это работает для правых кликов в точке, где вызывается этот делегат меню.
 Ira Cooke06 дек. 2013 г., 10:10
Я думаю, что оригинальный плакат попросил решение, щелкнув правой кнопкой мыши по строке. Из того, что я мог сказать этоНевозможно вызвать любой из этих методов с правой кнопкой мыши.
 Graham Miln06 дек. 2013 г., 08:43
Это работает, пока он вызывается из NSTableViews целевое действие или метод doubleAction. У вас есть другая ситуация, когда вы хотите щелкнуть строку?
 Ira Cooke05 дек. 2013 г., 20:45
Я неНе думаю, что это должно работать при щелчке правой кнопкой мыши по строке, потому что возвращаемое значение clickedRow имеет смысл только для цели 's реализация действия или метода двойного действия.
 Michael Tsai04 июл. 2017 г., 17:20
Согласно примечаниям к выпуску 10.5 (developer.apple.com/library/content/releasenotes/AppKit/...): «Главное, на что нужно обратить внимание, это то, что clickedRow и clickedColumn теперь будут действительны, когда выскочит контекстное меню. ... Свойства clickedRow и clickedColumn будут по-прежнему действительны при отправке действия из NSMenuItem »., Я обнаружил, что это работаетесли столыmenu розетка установлена, и если вы переопределите-menuForEvent: ты должен позвонить.super

выполнивmenuForEvent: вNSTableView подкласс:

@implementation MyTableView

- (NSMenu *)menuForEvent:(NSEvent *)theEvent
{
    int row = [self rowAtPoint:[self convertPoint:theEvent.locationInWindow fromView:nil]];
    if (row == -1) 
        return nil;
    if (row != self.selectedRow)
        [self selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
    return self.menu;
}

@end
 Michael Tsai04 июл. 2017 г., 01:22
Это не соответствует поведению в Finder и Mail, что позволяет использовать контекстное меню, чтобы воздействовать на строку, не затрагивая выбор.
Решение Вопроса

я уверен, что вы можете переопределитьNSView- (NSMenu*)menuForEvent:(NSEvent*)theEvent, Пример вэта ссылка выполняет преобразование точки для определения индекса.

-(NSMenu*)menuForEvent:(NSEvent*)theEvent
{
    NSPoint mousePoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
   int row = [self rowAtPoint:mousePoint];
   // Produce the menu here or perform an action like selection of the row.
}
 Abcd Efg19 сент. 2012 г., 14:44
Я надеялся найти способ без подкласса NSTableView.
 Giles12 февр. 2018 г., 16:02
ГрэмОтвет ниже работает без подклассов. Установите NSTableView 'Свойство меню для элемента NSMenu, которым вы владеете. Установить, что NSMenu 'с делегатом. В menuNeedsUpdate (_: NSMenu) вы можете вызвать clickedRow () для NSTableView. Это работает для правых кликов в точке, где вызывается этот делегат меню.
Обновленный ответ

NSTableView.clickedRow, В любом случае, это свойство доступно только в определенные моменты и, как правило, просто.-1

Когда этот индекс будет доступен? Тот'вNSMenuDelegate.menuWillOpen метод. Таким образом, вы соответствуете делегату и реализуете метод в своем классе и получаете доступ кclickedRow имущество. Это'сделано.

final class FileNavigatorViewController: NSViewController, NSMenuDelegate {
    let ov = NSOutlineView() // Assumed you setup this properly.
    let ctxm = NSMenu()
    override func viewDidLoad() {
        super.viewDidLoad()
        ov.menu = ctxm
        ctxm.delegate = self
    }
    func menuWillOpen(_ menu: NSMenu) {
        print(outlineView.clickedRow)
    }
}

Индекс выбранной строки доступен, пока вы не щелкните элемент в меню. Так что это тоже работает.

final class FileNavigatorViewController: NSViewController {
    let ov = NSOutlineView() // Assumed you setup this properly.
    let ctxm = NSMenu()
    let item1 = NSMenuItem()
    override func viewDidLoad() {
        super.viewDidLoad()
        ov.menu = ctxm
        ov.addItem(item1)
        ov.target = self
        ov.action = #selector(onClickItem1(_:))
    }
    @objc
    func onClickItem1(_: NSObject?) {
        print(outlineView.clickedRow)
    }
}

Я проверял это на macOS Sierra (10.12.5).

Старый ответ

Начиная с OS X 10.11, Apple наконец-то добавила метод доступаclickedRow без труда. Просто подклассNSTableView и переопределите этот метод, и выполучуclickedRow насколько я испытал.

func willOpenMenu(menu: NSMenu, withEvent event: NSEvent)

Это требует подклассов, но в любом случае, самый чистый и простой способ доступа.clickedRow

Также там'метод сопряжения.

func didCloseMenu(menu: NSMenu, withEvent event: NSEvent?)
 ixany30 янв. 2017 г., 11:36
Было бы здорово, если бы вы могли привести рабочий пример. Последние два дня я потратил на получение контекстного меню в работе NSTableCellView, но не смог😓

Ваш ответ на вопрос