Ctrl + клик не вызывает меню ForEvent - PullRequest
6 голосов
/ 20 августа 2011

Все, Итак, у меня есть подкласс NSBox, и в нем есть подвиды, такие как метка и два изображения. Я переопределил menuForEvent: в нем. Однако, когда я нажимаю на NSBox, чтобы выбрать его, а затем нажимаю Control + Click на любом из его подпредставлений, тогда menuForEvent: никогда не вызывается.

Я не понимаю, почему это так.

Ответы [ 2 ]

5 голосов
/ 23 сентября 2015

Существует разница в том, как с помощью NSView обрабатываются управляющие и правые щелчки (как указывал jfewtr).Контекстные меню появятся для щелчка правой кнопкой мыши , если щелчок попадает в подпредставление, но не для управляющего щелчка .

Я был удивлен этим и на самом деленаписал пост об этом с более подробной информацией здесь: Причуды NSView при нажатии на клавишу управления

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

- (void)mouseDown:(NSEvent *)theEvent
{
    if (theEvent.modifierFlags & NSControlKeyMask)
    {
        [NSMenu popUpContextMenu:[self menuForEvent:theEvent] withEvent:theEvent forView:self];
    }
}

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

2 голосов
/ 17 апреля 2012

Вам необходимо также реализовать menuForEvent: в подпредставлениях и перенаправить событие в реализацию menuForEvent вашего суперпредставления (подкласс NSBox):

- (NSMenu *)menuForEvent:(NSEvent *)event
{
    return [[self superview] menuForEvent:event];
}

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

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