【问题标题】:SwiftUI and macOS Option-click a ButtonSwiftUI 和 macOS 按住 Option 键单击按钮
【发布时间】:2021-03-11 17:11:52
【问题描述】:

您好,我如何检测用户何时选择单击按钮?

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

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

【问题讨论】:

标签: swift macos swiftui


【解决方案1】:

我不知道纯 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 Event Manager 中使用。由于历史原因,我倾向于保留它们。我用所有旧的密钥代码创建了一个github gist

有了这个扩展,使用它就很简单了。你的代码 sn-p 变成了

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

【讨论】:

  • 您说的非常正确,macOS 应用程序需要工作才能真正成为 Mac 上的一流体验。我什至不能禁用显示标签菜单项!!!
  • 有趣的是你应该提到菜单。我最近不得不自己处理这个问题。我最终创建了一个包,可以让您以 SwiftUI 方式管理菜单栏(又名“主菜单”)。定义菜单很像定义视图。这是一个本地包,需要吐槽和润色,但如果你有兴趣,我可以抽时间把它放在 GitHub 上。
  • 我正在做的应用程序是供个人使用的,所以没有时间表发布它,它并不紧急。但我认为有更多的人和我有同样的问题,所以我会说这会对他们有所帮助。 macOS 上的 SwiftUI 如此粗糙,真是太疯狂了。它看起来像未来,但它还没有。
  • @TertulianoMáximoAfonso,如果你想查看的话,我有时间将我的 MacMenuBar 包放在 GitHub 上。它远未完成,但您可能会发现它很有用
猜你喜欢
  • 2018-02-04
  • 2022-01-03
  • 2020-06-07
  • 2019-05-19
  • 2022-11-10
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多