【问题标题】:Stop listening to NSEvent in Swift停止在 Swift 中收听 NSEvent
【发布时间】:2021-02-16 10:45:40
【问题描述】:

我试图让 NSEvent 停止监听本地事件。有没有办法在创建事件后访问它?(这是我在removeEvent中尝试失败的方法)

    override func viewDidLoad() {
        super.viewDidLoad()

        NSEvent.addLocalMonitorForEvents(matching: .keyDown, handler: sayHello(event:))
    }

    func sayHello(event: NSEvent) -> NSEvent {
        print("Welcome")
        return event
    }
    
    @IBAction func removeEvent(_ sender: NSButton) {
        let event  = NSEvent.addLocalMonitorForEvents(matching: .keyDown, handler: sayHello(event:))

        NSEvent.removeMonitor(event)
    }

【问题讨论】:

  • 您要删除removeEventviewDidLoad 中添加的事件处理程序吗?
  • 我正在尝试删除在viewDidLoad 中添加的事件。在removeEvent 中初始化的事件是试图访问它。
  • addLocalMonitorForEvents 创建一个新的事件处理程序。将viewDidLoad 中创建的事件处理程序存储在一个属性中。
  • 你知道怎么做吗?

标签: swift macos events nsevent


【解决方案1】:

只需创建对事件监视器的引用,将实例属性添加到视图控制器并使用按钮操作将其删除:

var monitor: Any?

func sayHello(_ event: NSEvent) -> NSEvent {
    print(#function)
    return event
}

override func viewDidLoad() {
    super.viewDidLoad()
    monitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown, handler: sayHello)

}

@IBAction func removeEvent(_ sender: NSButton) {
    if let monitor = monitor {
        NSEvent.removeMonitor(monitor)
    }
}

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2017-05-11
    • 2013-10-13
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多