Какао: Как получить контекстное меню, если щелкнуть правой кнопкой мыши ячейку NSTableView - PullRequest
14 голосов
/ 31 мая 2011

У меня есть TableView с пользовательскими ячейками.Я хочу, чтобы контекстное меню появлялось, когда пользователь щелкает правой кнопкой мыши (или любым другим вариантом Apple правой кнопкой мыши) на одной из ячеек (и знаю, на какую ячейку они нажали).

Я попытался создать подкласс NSTableView ипереписать этот метод:

- (NSMenu *)menuForEvent:(NSEvent *)theEvent;

Но он никогда не вызывается.

С другой стороны,

- (void)rightMouseDown:(NSEvent *)theEvent;

Получает вызов.Но я не уверен, что это то, что нам нужно.

Подробнее:

//
//  PTTableView.m
// 
//
//  Created by Nathan Hazout on 5/31/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "PTTableView.h"


@implementation PTTableView

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (void)rightMouseDown:(NSEvent *)theEvent { 
    NSLog(@"entered rightMouseDown");
}

- (NSMenu *)menuForEvent:(NSEvent *)theEvent {
    NSLog(@"entered menuForEvent");
    return [super menuForEvent:theEvent];
}

- (NSView *)hitTest:(NSPoint)aPoint{
    NSLog(@"entered hitTest");
    return [super hitTest:aPoint];
}

- (void)dealloc
{
    [super dealloc];
}

@end

rightMouseDown вызывается.hiTest вызывается много раз.Но menuForEvent нет.

Ответы [ 2 ]

58 голосов
/ 31 мая 2011

Нет необходимости разбираться с обработкой событий, все, что вам нужно сделать, чтобы назначить контекстное меню, - установить выход menu табличного представления так, чтобы он указывал на объект NSMenu, который вы хотите использовать для контекстного меню.

Вы можете сделать это в Интерфейсном Разработчике, перетаскивая объект NSMenu в файл пера и перетаскивая элемент управления из представления таблицы в меню, чтобы установить выход.

Кроме того, вы можете использовать метод -setMenu: NSTableView (унаследованный от NSResponder) для программного назначения меню.

5 голосов
/ 03 апреля 2019

Ответ Роба на Swift 4:

Добавить меню:

let menu = NSMenu()
menu.addItem(NSMenuItem(title: "Edit", action: #selector(tableViewEditItemClicked(_:)), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: "Delete", action: #selector(tableViewDeleteItemClicked(_:)), keyEquivalent: ""))
tableView.menu = menu

Функции:

@objc private func tableViewEditItemClicked(_ sender: AnyObject) {

    guard tableView.clickedRow >= 0 else { return }

    let item = items[tableView.clickedRow]

    showDetailsViewController(with: item)
}

@objc private func tableViewDeleteItemClicked(_ sender: AnyObject) {

    guard tableView.clickedRow >= 0 else { return }

    items.remove(at: tableView.clickedRow)

    tableView.reloadData()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...