使用Swift进行MASShortcut的简单回调

iqu*_*lis 4 macos cocoapods swift

我安装了最新的(2015-02-03)MASShortcut作为CocoaPod以及一个非常基本的OS X Swift应用程序的正确桥接头.我最终得到了以下代码,我不知道我做错了什么?:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!

    func callback() {
         NSLog("callback")
    }

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        let keyMask = NSEventModifierFlags.CommandKeyMask | NSEventModifierFlags.AlternateKeyMask
        let shortcut = MASShortcut.shortcutWithKeyCode(kVK_Space, modifierFlags: UInt(keyMask.rawValue))
        MASShortcut.addGlobalHotkeyMonitorWithShortcut(shortcut, handler: callback)
    }

    func applicationWillTerminate(aNotification: NSNotification) {
        // Insert code here to tear down your application
    }


}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Kei*_*ley 5

这里有一些问题.在修复它们之前,你应该确保MASShortcut安装了2.1.2(你可以在你的脑中看到这个Podfile.lock).如果你不这样做,你应该跑去pod update获得最新版本.

测试此问题的另一个潜在问题是您的快捷方式与OS X默认快捷方式冲突.在您当前的示例中,Command+ Option+ Space必须打开Finder窗口并选择搜索字段.如果您禁用此功能,那么我建议您添加Control到测试用例中.

因此到目前为止,您的代码存在一些问题.首先,我建议将您的keyMask声明更改为:

let keyMask: NSEventModifierFlags = .CommandKeyMask | .ControlKeyMask | .AlternateKeyMask
Run Code Online (Sandbox Code Playgroud)

通过这种方式,Swift可以推断出类型,你只需要NSEventModifierFlags一次(注意我在.ControlKeyMask这里添加了上面的评论).

关于Swift中枚举的一个很酷的部分是你可以调用rawValue它们.在这种情况下rawValueNSEventModifierFlagsUInt创建快捷方式时,这将解决您的类型的问题.

现在你的keyCode论点也必须是一个UInt.所以你可以将它拉出一个临时值:

let keyCode = UInt(kVK_Space)
Run Code Online (Sandbox Code Playgroud)

在Swift中,看起来像类级初始化器的方法实际上是转入Swift初始化器.所以在这种情况下,你试图调用shortcutWithKeyCode:modifierFlags:当Swift实际上将其转换为初始化器时调用的类方法.所以你可以像这样创建你的快捷方式:

let shortcut = MASShortcut(keyCode: keyCode, modifierFlags: keyMask.rawValue)
Run Code Online (Sandbox Code Playgroud)

请注意rawValue将我们的修饰符标志转换为a 的调用UInt.

最后,全局注册此快捷方式的API实际上是一种方法MASShortcutMonitor.在您的桥接标题中,您有:

#import <MASShortcut/MASShortcut.h>
Run Code Online (Sandbox Code Playgroud)

您必须添加新导入才能获得此API.新的是:

#import <MASShortcut/MASShortcutMonitor.h>
Run Code Online (Sandbox Code Playgroud)

现在您可以注册您的快捷方式:

MASShortcutMonitor.sharedMonitor().registerShortcut(shortcut, withAction: callback)
Run Code Online (Sandbox Code Playgroud)

而你的一切.您的回调函数已正确设置!

最后一件事.我建议你删除你的快捷方式applicationWillTerminate::

MASShortcutMonitor.sharedMonitor().unregisterAllShortcuts()
Run Code Online (Sandbox Code Playgroud)