какао + контекстно-зависимое меню в NSTableView с несколькими выбранными строками - PullRequest
1 голос
/ 01 октября 2009

У меня проблема с отображением контекстно-зависимого меню при щелчке элемента управления при просмотре таблицы, когда выбрано несколько строк. Работает нормально, когда выделяется одна строка, а затем нажимается элемент управления. Способ, которым я это реализую, показан ниже:

-(void)doSingleClick  
{  
    NSLog(@"single clicked");

    if([[NSApp currentEvent] modifierFlags] & NSControlKeyMask)
    {

        NSLog(@"control clicked.......");

        [NSMenu popUpContextMenu:[self showContextMenu] withEvent:[NSApp currentEvent] forView:tableView];

        return;
    }

}

и функция showContextMenu возвращает объект NSMenu.

Я так понимаю, так как мое табличное представление по какой-то странной причине не распознает события mouseDown, mouseUp или menuForEvent.

проблема с указанным выше сегментом кода заключается в том, что при выделении нескольких строк и нажатии элемента управления он не распознает щелчок элемента управления и не входит в этот цикл и, следовательно, не отображает контекстное меню.

Пожалуйста, предложите мне механизм для достижения этого.

Спасибо

Ответы [ 4 ]

17 голосов
/ 15 декабря 2009

Я не рекомендую подход, который дан в ответах выше. Вместо этого посмотрите на пример " DragNDropOutlineView " в Leopard и выше. Это и примечания к выпуску дают надлежащий способ реализации контекстных меню для одной строки или нескольких строк. Это включает в себя, чтобы AppKit автоматически делал правильное выделение.

Корбин Данн (Инженер-программист NSTableView)

1 голос
/ 30 июня 2010

Ответ Корбина здесь самый лучший.

текст ссылки

1 голос
/ 01 октября 2009

У меня есть класс tableviewcontroller, который является подклассом NSTableView.

Это очень плохое наименование и говорит о том, что вы неправильно проектируете свое приложение. Представления не контроллеры. Держите их отдельно.

но этот класс, в котором я реализовал метод menuForEvent, но по какой-то причине он не вызывается.

Сделали ли вы просмотр таблицы экземпляром этого класса в Интерфейсном Разработчике? Если нет, то ваш экземпляр по-прежнему является NSTableView, а подкласс, который вы написали, - это то, что Ян Хиксон может назвать «произведением фантастики».

0 голосов
/ 01 октября 2009

Я не верю, что метод действия вызывается при выборе нескольких строк.

Возможно, было бы намного проще переопределить метод menuForEvent: в NSTableView. Для этого вам нужно создать подкласс NSTableView, но это будет более чистое решение.

Вы также можете создать неформальный протокол (категория на NSObject), и делегат NSTableView вернет соответствующее меню.

@interface NSObject (NSCustomTableViewDelegate)

- (NSMenu *)tableView:(NSTableView *)tableView menuForEvent:(NSEvent *)event;

@end

@implementation NSObject (NSCustomTableViewDelegate)

- (NSMenu *)tableView:(NSTableView *)tableView menuForEvent:(NSEvent *)event {
    return nil;
}

@end

А в вашем NSTableView подклассе:

- (NSMenu *)menuForEvent:(NSEvent *)event {
    return [[self delegate] tableView:self menuForEvent:event];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...