Можно ли создать подкласс NSButton, переопределить события mouseDown и mouseUp и использовать методы рисования суперкласса - PullRequest
0 голосов
/ 28 января 2019

Создание подкласса NSButton для захвата событий mouseUp и mouseDown, но с сохранением методов рисования суперкласса NSButtons.

Моя цель, как указано выше, создать подкласс NSButton и заставить его выполнять свои обычные функции суперкласса, в то же время позволяя мнепереопределить mouseDown и mouseUp и отправить его обратно в действие с NSEvent, чтобы код кнопки мог затем проверить, какой тип даже произошел, и ответить соответственно.

Когда я экспериментировал с подклассом NSButton, я заметил, что когдаВы переопределяете mouseDown, как показано ниже:

override open func mouseDown(with event: NSEvent)
{
    super.mouseDown(with: event)

    // call the target with left button down
    _ = target?.perform(action, with: event)
}

Похоже, что super.mouseDown захватывает события мыши, и впоследствии ваш подкласс NSButton не получит соответствующее событие mouseUp.

Видя, как все работает, я просто переопределил mouseDown и mouseUp, не вызывая никаких функций Суперкласса.Это действительно обеспечивает даже для mouseDown и mouseUp.Я пересылаю событие в действие и позволяю коду действия обработать, какое событие произошло, и все в порядке.Единственное предостережение в том, что поведение по умолчанию для состояния кнопки не происходит.Кнопка останется в исходном невыбранном состоянии.Если бы я изменил состояние и принудительно обновил кнопку, можно было бы подумать, что она нарисует кнопку в выбранном состоянии.Этого не происходит, поэтому я пишу для некоторой помощи.

Я бы хотел иметь возможность рисовать по умолчанию поведение события NSButton mouseDown.Есть ли способ установить свойство NSButton или его состояние и вызвать перерисовку?Кажется, я не могу этого сделать.Если нет способа сделать это, то я буду вынужден рисовать содержимое кнопок в выбранном состоянии, как-то через переопределение метода рисования.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 28 января 2019

Вместо этого вы можете проверить событие mouseUp в @IBAction кнопки:

@IBAction private func buttonClicked(_: AnyObject?) {
    NSLog("Event: \(NSApp.currentEvent)")
}

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

...