Я ищу способ получить индекс строки с прямым щелчком от NSTableView
, но я не могу найти для него каких-либо методов делегата или атрибутов класса. Любое предложение приветствуется.
NSTableView Right Clicked Row Index
Ответ 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)
}