在 Swift 中多次运行按键按下事件处理程序

问题描述

我正在尝试在 macOS 应用程序中按下给定键时执行某些操作。首先,我遇到了一个问题,在每次按下时多次检测到 keyDown 事件,因此多次执行处理程序。根据建议,我添加代码来检查事件是否重复,并且当时似乎可以正常工作。但是,此解决方案似乎仅在某些时候有效,其他时候则多次检测到事件。此外,我似乎无法在有效和无效的情况下找到模式。可能是什么问题,我该如何解决代码

    override func viewDidLoad() {
        super.viewDidLoad()
        NSEvent.addLocalMonitorForEvents(matching: .keyDown,handler: checkKeyDown(event:))
    }

    func checkKeyDown(event: NSEvent) -> NSEvent{
        if event.isARepeat == false{
            if event.keyCode == 36{
                print("Hello World!")
            }
        }
        return event
    }

解决方法

在窗口关闭时移除事件监视器似乎解决了这个问题。


var numKeyDown : Any?

 override func viewDidLoad() {
        super.viewDidLoad()
        numKeyDown = NSEvent.addLocalMonitorForEvents(matching: .keyDown,handler: checkKeyDown(event:))
    }

 override func viewWillDisappear(){
     if let numMonitor = self.numKeyDown {
        NSEvent.removeMonitor(numMonitor)
     }
 }

    func checkKeyDown(event: NSEvent) -> NSEvent{
        if event.isARepeat == false{
            if event.keyCode == 36{
                print("Hello World!")
            }
        }
        return event
    }