【问题标题】:Key down event handler running multiple times in Swift在 Swift 中多次运行的按键事件处理程序
【发布时间】:2021-03-01 12:07:51
【问题描述】:

当在 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
    }

【问题讨论】:

  • viewDidLoad 执行一次了吗?
  • 是的。它仅在应用启动时执行。

标签: swift nsevent


【解决方案1】:

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


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
    }

【讨论】:

  • 所以viewDidLoad被执行了不止一次?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2014-01-15
  • 2016-08-30
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多