Изменить поведение NSTextField для нескольких кликов подряд

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

Я хочу, чтобы первый щелчок "активировал" текстовое поле и затем продолжался с начала (например, сброс счетчика кликов события).

У меня есть следующие идеи, но я не знаю, как их реализовать и действительно ли они имеют смысл:

  • Как-то изменить время, используя +[NSEvent doubleClickInterval] и замедлите второй щелчок.
  • Уменьшить количество кликов программно?
  • Сделайте NSTextField невыбираемым с помощью -hitTest:, переместите щелчок к суперпредставлению, измените какой-либо параметр текстового поля и примите следующие щелчки. В этом случае количество кликов второго клика по-прежнему равно 2.
  • Override -mouseDown: и не называй супер. Это нарушает функциональность выбора NSTextField.

Я надеюсь, что есть более простой способ добиться этого, который я упустил.

Спасибо за ваши ответы!

Вот графическое представление проблемы:Изменение поведения множественного клика для NSTextField

2 ответа

Решение

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

- (void)mouseDown:(NSEvent *)theEvent
{
    if (self.specialBehavior) {
        theEvent = [NSEvent mouseEventWithType:theEvent.type
                                      location:theEvent.locationInWindow
                                 modifierFlags:theEvent.modifierFlags
                                     timestamp:theEvent.timestamp
                                  windowNumber:theEvent.windowNumber
                                       context:theEvent.context
                                   eventNumber:theEvent.eventNumber
                                    clickCount:theEvent.clickCount - 1
                                      pressure:theEvent.pressure];
    }

    [super mouseDown:theEvent];
}

Чтобы упростить этот длинный вызов метода, я написал метод категории для NSEvent который уменьшает количество кликов события.

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

После редактирования: вот код, который я использую в своем классе наложения:

@implementation Overlay

static NSComparisonResult rdComparator( NSView *view1, NSView *view2, void *context ) {
    if ([view1 isKindOfClass:[NSTextField class]])
        return NSOrderedDescending;
    else if ([view2 isKindOfClass:[NSTextField class]])
        return NSOrderedAscending;
    return NSOrderedSame;
}


-(void)mouseDown:(NSEvent *)theEvent {
    self.box.fillColor = [NSColor redColor];
    NSView *contentView = self.box.subviews.lastObject;
    [contentView sortSubviewsUsingFunction:rdComparator context:nil];
}
Другие вопросы по тегам