NSTableView Right Clicked Row Index - программирование
Подтвердить что ты не робот

NSTableView Right Clicked Row Index

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

4b9b3361

Ответ 1

Пока я этого не сделал, я уверен, что вы можете переопределить 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.
}

Ответ 2

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

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

Ответ 3

Обновленный ответ

Если вы хотите получить индекс нажатой строки при открытии меню, ответ будет 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?)

Ответ 4

Просто выберите строку правой кнопкой, выполнив 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

Ответ 5

если вам не нужно открывать NSMenu, но вам нужно знать "действие правой кнопкой мыши с номером строки", я думаю, что самый простой способ ниже. (Код 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)
  }