Почему в Swift не работает функция keyDown? - PullRequest
0 голосов
/ 14 июля 2020

Я создал свой собственный класс кнопок (FKButton) в SpriteKit. Я хочу, чтобы в нем было большинство функций, которые мне понадобятся в будущем, поэтому он включает сочетания клавиш, действия, звуки и т. Д. c. Кажется, все работает нормально, кроме функции keyDown(with event: NSEvent) (кстати, «горячая клавиша» - это клавиша, которая имеет тот же эффект, что и нажатие самой кнопки. Например, нажатие Enter на клавиатуре часто делает то же самое, что и нажатие кнопку на вашем экране). Я установил для acceptsFirstResponder и isUserInteractionEnabled значение true. Код, который я написал для функции keyDown в моем классе кнопок, выглядит следующим образом:

override func keyDown(with event: NSEvent) {
    print("Detected key press: \(event.keyCode).")
    if shortcutKeys.contains(event.keyCode) {
        actionAtClick()
    }
}

Класс наследуется от SKNode, потому что я хочу добавить к нему еще один класс, наследующий от SKScene . Это класс:

class GameScene: SKScene {

    let button = FKButton(size: CGSize(width: 200, height: 100), text: "Button", fontSize: 40)

    override func didMove(to view: SKView) {
    
        button.shortcutKeys = [36,76]
    
        self.addChild(button)
    
    }
}

Я только что удалил все, что не имеет отношения к делу (например, button.fontColor = NSColor.white et c.). Правильные действия происходят, когда я нажимаю кнопку мышью, но по какой-то причине она не реагирует на ввод с клавиатуры. Я не понимаю в чем дело. Я понимаю, что вам тоже может быть трудно, но все советы приветствуются. Спасибо.

Примечание: это не дубликат вопроса, упомянутого в комментариях. Я не поместил свой код в AppDelegate, как это сделал человек в упомянутом сообщении. Таким образом, это не решило эту проблему.

1 Ответ

0 голосов
/ 15 июля 2020

- (void)keyDown:(NSEvent *)event;

Это метод, унаследованный от класса NSResponder, если ваш FKButton не является наследником NSResponder, вы можете написать override func keyDown(with event: NSEvent) без эффекта.

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

...