NSEvents даже не достигает окна? [Дубликат]

Чтобы избежать этой проблемы, используйте nextLine(); сразу после nextInt();, поскольку это помогает очистить буфер. Когда вы нажимаете ENTER, nextInt(); не захватывает новую строку и, следовательно, позже пропускает код Scanner.

Scanner scanner =  new Scanner(System.in);
int option = scanner.nextInt();
scanner.nextLine(); //clearing the buffer
23
задан Cripto 7 September 2015 в 22:57
поделиться

3 ответа

Мне удалось заставить его работать из подкласса NSWindowController

class MyWindowController: NSWindowController {

    override func keyDown(theEvent: NSEvent) {
        print("keyCode is \(theEvent.keyCode)")
    }
}

UPDATE:

import Cocoa

protocol WindowControllerDelegate {
    func keyDown(aEvent: NSEvent)
}

class WindowController: NSWindowController {

    var delegate: WindowControllerDelegate?

    override func windowDidLoad() {
        super.windowDidLoad()
        delegate = window?.contentViewController as! ViewController
    }
    override func keyDown(theEvent: NSEvent) {
        delegate?.keyDown(theEvent)
    }

}

и ViewController:

class ViewController: NSViewController, WindowControllerDelegate {

    @IBOutlet weak var textField: NSTextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }
    override func keyDown(theEvent: NSEvent) {
        textField.stringValue = "key = " + (theEvent.charactersIgnoringModifiers
            ?? "")
        textField.stringValue += "\ncharacter = " + (theEvent.characters ?? "")
        textField.stringValue += "\nmodifier = " + theEvent.modifierFlags.rawValue.description
    }

}
42
ответ дан Leo Dabus 1 September 2018 в 07:58
поделиться

Я пытался найти ответ для быстрого 3, вот что сработало для меня:

Swift 3

import Cocoa

// We subclass an NSView

class MainView: NSView {

    // Allow view to receive keypress (remove the purr sound)
    override var acceptsFirstResponder : Bool {
        return true
    }

    // Override the NSView keydown func to read keycode of pressed key
    override func keyDown(with theEvent: NSEvent) {
        Swift.print(theEvent.keyCode)
    }

}
6
ответ дан Hunter Maximillion Monk 1 September 2018 в 07:58
поделиться

Swift4

Просто нашел решение для той же самой проблемы, Swift4. Идея в том, что: если нажатая клавиша обрабатывалась пользовательской логикой, обработчик должен возвращать nil, иначе (необработанное) событие ...

class MyViewController: NSViewController {
   override func viewDidLoad() {
      super.viewDidLoad()
      // ...
      NSEvent.addLocalMonitorForEvents(matching: .keyDown) {
         if self.myKeyDown(with: $0) {
            return nil
         } else {
            return $0
         }
      }
   }
   func myKeyDown(with event: NSEvent) -> Bool {
      // handle keyDown only if current window has focus, i.e. is keyWindow
      guard let locWindow = self.view.window,
         NSApplication.shared.keyWindow === locWindow else { return false }
      switch Int( event.keyCode) {
      case kVK_Escape:
         // do what you want to do at "Escape"
         return true
      default: 
         return false
      }
   }
}

И вот мы: no Purr / Funk звук при нажатии клавиши ...

[Обновление] Добавлена ​​проверка keyWindow. Без этого keyDown () запускается, даже если в другом представлении / окне содержится первый ответчик ...

2
ответ дан Kriggel 1 September 2018 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: