Cocoa 键盘事件处理:Key Equivalents

本文通过具体例子介绍了如何使用 NSMenu 和 Menu Item 的 Key Equivalents 给应用增加快捷键支持。

场景

我们在开发 Linnk 的 Mac 客户端,第二栏是书签列表,对于每个书签的 cell 我们加上了右键菜单来完成一些固定的操作,比如进入编辑、星标、删除等,在《Cocoa:给 NSTableView 加上右键菜单》这篇文章中我们介绍了怎么给 table 加上右键菜单。右键菜单的 Menu Item 可以设置快捷键(下图中可以看到快捷键提示),但是这个快捷键只有在菜单出现的时候才会响应,现在我们需要在菜单没有出现的时候也能用同样的快捷键对 cell 进行操作,这里虽然可以通过继承 NSTableViewkeyDown: event 来实现,更简单的方式是在 Main Menu 增加对应的 Menu Item 使用 Menu ItemKey Equivalents 来实现。

Mac 上的每一个应用都有一个主菜单,当应用 Active 的时候,主菜单就是左上角的一排。

Linnky

下图中选中的 Go 其实就是一个 Menu Item,下面展开的是他的 SubmenuSubmenu 里面每一行对应一个 Menu Item,右侧显示设置好的 Key Equivalents

  • 可以在 Interface Builder 中很方便的定义按键;
  • 对于不熟悉应用的用户来说,菜单栏能够直观的表示快捷键的作用;
  • 没有键盘的用户也可以通过点击菜单栏使用该功能。

最重要的应该是后面两点,用户在使用你的应用过程中,通过查看左上角的菜单栏,就可以了解应用支持哪些快捷操作,同时习惯使用鼠标或者触摸板操作的用户也有一个操作入口。

创建菜单和添加 User Defined Action

  1. 打开 MainMenu.xib
  2. 选择 First Responder
  3. 选择 Utilities 面板中的 Attributes Inspector
  4. 现在 Inspector 中有内容为空的 User Defined 列表,点击下方“+”按钮添加新的 Action,即自定义函数。我们会增加一项名为“Item”的子菜单和 EditStarDelete 三个 Item,这里可以加上这三个对应的 action,后面需要在代码里实现

  1. 在 MainMenu.xib 文件中新增子菜单 Items 和三个 Menu Item
  2. 将新增 Item 的 Key Equivalent 设为需要的快捷键

  1. 选择 Connections Inspector;
  2. 将 Sent Actions -> action 后的小圆圈连接至 First Responder,出现一个弹窗;
  3. 在弹窗中选择相应的方法,可以看到第四步中添加的三个 action:

实现对应方法

那么问题来了,我们要在哪里实现对应的方法呢?Menu 在处理 Key Equivalents 的时候,会沿着 Responder Chain 从下往上寻找,如果找不到,那么菜单会自动变为 Disable 状态。在我们的界面上,当选中一个书签 Cell 的时候当前 window 的 Responder Chain 是 table view -> Clip View -> Scroll View -> View Controller,我们选择在 View Controller 实现需要的三个方法。

func handleMenuEdit(_ sender: NSMenuItem) {

}

func handleMenuStar(_ sender: NSMenuItem) {

}

func handleMenuDelete(_ sender: NSMenuItem?) {

}

添加了这三个方法后 Main Menu 上的菜单就变成 Enable 状态,可以愉快的使用快捷键了。

我们关于快捷键的其他文章

参考

广告

可以通过下载和购买我们的作品支持我们 🍺

  • CurrencyX Mac 上小而美的汇率应用
  • Price Tag 发现限免 iOS 应用,给你省钱
  • SalesX 开发者工具,最快速的给你展示应用的下载量和收入
  • Pinbox 第三方 Pinboard Mac 客户端

如果你对自由职业、独立开发、远程工作、iOS/Mac 开发感兴趣,欢迎加入我的小密圈:im61 的分享