【问题标题】:Calling the Emoji & Symbols picker from NSButton action从 NSButton 操作调用 Emoji & Symbols 选择器
【发布时间】:2016-07-27 11:40:03
【问题描述】:

我是 Swift 的新手,目前正在为 macOS 开发一个小型消息传递应用程序。基本应用程序已完成,但我正在尝试添加表情符号选择器。

我想添加一个按钮来调出“表情符号和符号”窗口。这会在启动应用程序时自动添加到“编辑”菜单中,但我希望通过按下 NSButton 来弹出它(就像在本机 Mac 消息应用程序中一样)。

有没有办法调用系统函数来显示表情符号选择器,或者模拟键盘快捷键(ctrl+cmd+space)的方法?如果是这样,我需要采取哪些步骤来实施它?

【问题讨论】:

标签: swift xcode macos emoji


【解决方案1】:

感谢使用键盘快捷键的建议。

下面是我使用的代码。我无法模拟两个被按下的修饰键,因此解决方案是创建一个自定义 CGEventFlags 项。

// Setup a custom CGEventFlags Item with value of .MaskControl and .MaskCommand
    let commandControlMask = (CGEventFlags.MaskCommand.rawValue | CGEventFlags.MaskControl.rawValue)
    let commandControlMaskFlags = CGEventFlags(rawValue: commandControlMask)!

    // Press Space key once
    let space = CGEventSourceCreate(.HIDSystemState)
    let keyDown = CGEventCreateKeyboardEvent(space, 49 as CGKeyCode, true)
    CGEventSetFlags(keyDown, commandControlMaskFlags)
    CGEventPost(.CGHIDEventTap, keyDown)
    let keyUp = CGEventCreateKeyboardEvent(space, 49 as CGKeyCode, false)
    CGEventSetFlags(keyUp, commandControlMaskFlags)
    CGEventPost(.CGHIDEventTap, keyUp)

【讨论】:

  • 请注意,当应用程序在沙盒中运行时,发布这些事件将不起作用。我不知道有任何其他 API 可以在应用沙箱范围内完成任务。
  • 原来你可以使用 [NSApp orderFrontCharacterPalette:nil] 来完成这个:twitter.com/lapcatsoftware/status/859539614373117952
  • @chockenberry 您是如何将字符调色板中的字符返回到您的应用程序的?
  • ...您如何强制弹出窗口显示为特定 NSTextField 上的弹出窗口?我已将其设为第一响应者,但字符面板仍显示为浮动窗口。
  • @CliftonLabrum 返回角色是全自动的。只需将您的 textView 作为发件人即可。所以 [NSApp orderFontCharacterPalette:textView],只要确保你之前在 textView 上调用 becomeFirstResponder。
【解决方案2】:

使用 IBOutlets 的简单示例

class ViewController: NSViewController {

    @IBOutlet weak var textView: NSTextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    @IBAction func buttonTapped(_ sender: Any) {
        textView.becomeFirstResponder()
        NSApp.orderFrontCharacterPalette(textView)
    }
}

【讨论】:

  • 你也可以只传递 nil - NSApp.orderFrontCharacterPalette(nil) 只要确保你的 textView 是第一响应者。您可以轻松桥接 orderFrontCharacterPalette 以在催化剂应用程序中使用。
【解决方案3】:
let commandControlMask = (CGEventFlags.maskCommand.rawValue | CGEventFlags.maskControl.rawValue)
let commandControlMaskFlags = CGEventFlags(rawValue: commandControlMask)

 // Press Space key once
let space = CGEventSource(stateID: .hidSystemState)
let keyDown = CGEvent(keyboardEventSource: space, virtualKey: 49 as CGKeyCode, keyDown: true)
keyDown?.flags = commandControlMaskFlags
keyDown!.post(tap: .cghidEventTap)
let keyUp = CGEvent(keyboardEventSource: space, virtualKey: 49 as CGKeyCode, keyDown: false)
keyUp?.flags = commandControlMaskFlags
keyUp?.post(tap: .cghidEventTap)

为 Swift 5.1 更新。但要求用户提供可访问权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2016-07-05
    相关资源
    最近更新 更多