首页 > 解决方案 > SwiftUI 和 macOS 按住 Option 键单击按钮

问题描述

嗨,我如何检测用户何时单击按钮?

Button("Example") {
    if optionKeyDown {
        // A
    } else {
        // B
    }
}

我正在使用 SwiftUI 应用程序生命周期。

标签: swiftmacosswiftui

解决方案


我不知道纯 SwiftUI 的做法,但 macOS 应用程序的 SwiftUI 仍然需要努力才能真正获得 Mac 用户期望的 UI 体验。

但是,您可以使用CoreGraphics.CGEventSource来实现您想要的:

import CoreGraphics

extension CGKeyCode
{
    static let kVK_Option     : CGKeyCode = 0x3A
    static let kVK_RightOption: CGKeyCode = 0x3D
    
    var isPressed: Bool {
        CGEventSource.keyState(.combinedSessionState, key: self)
    }
    
    static var optionKeyPressed: Bool {
        return Self.kVK_Option.isPressed || Self.kVK_RightOption.isPressed
    }
}

扩展中的特定键代码名称并不是特别 Swifty,因此如果您愿意,可以重命名它们。这些特定的名称可以追溯到 Classic MacOS Toolbox,并在早期 OS X 的 Carbon 事件管理器中使用。由于历史原因,我倾向于保留它们。我用所有旧的关键代码创建了一个github gist 。

有了这个扩展,使用它就很简单了。您的代码段变为

Button("Example") {
    if CGKeyCode.optionKeyPressed {
        // A
    } else {
        // B
    }
}

推荐阅读