【问题标题】:Catch key events in a NSWindow在 NSWindow 中捕获关键事件
【发布时间】:2013-05-26 23:59:36
【问题描述】:

我正在尝试获得一个非常基本的网络浏览器,它有 3 个 Web 视图(2 个隐藏,1 个始终可见)。

我想通过按 CMD+1、CMD+2、CMD+3 在这 3 个 webview 之间切换。

我已经创建了一个基本的 Cocoa 应用程序,在其中添加了 3 个 webview,引用了 Webkit 框架,并且我已经启动并运行它,这部分正在运行。

现在我想知道:

1) 如何捕捉关键事件? 看起来太复杂了,浏览事件结构文档让我头疼。

[咆哮]从做过很多 Windows 表单、GTK、QT 和 Java/C#/C++ 工作的人看来,XCode 通过移动所有内容并创建 3 种不同的方式来实现相同的事情等,似乎每个版本都变得更糟. 每次我必须使用它总是就像我必须重新学习所有东西一样。[/rant]

2)如何具体捕捉CMD+NUMBERS?

这只是为了我正在构建的一个快速生产力应用程序,以与 JIRA(项目管理)结合使用。

如果有人能指出好的方向,我将不胜感激。

每次我偶然发现一个很好的教程,它已经过时了,或者是针对大多数时间不再使用与 OS X 相同的 API 的 iOS 开发者。

对您的咆哮感到抱歉,感谢您的帮助!

【问题讨论】:

    标签: objective-c xcode webkit nswindow


    【解决方案1】:

    您要覆盖的是NSResponder method "keyDown:",我建议您将“WebView”子类化并创建自己的“keyDown”方法(确保在某处调用“[super keyDown: theEvent]”不过你的实现)。

    现在,在您的“keyDown”实现中,要查找 command 键,“NSEvent”对象响应"modifierFlags" method,其中一个标志是“NSCommandKeyMask ”。

    例如:

    NSUInteger flags = [theEvent modifierFlags];
    if( flags == NSCommandKeyMask ){
        // Got it!
    }
    

    【讨论】:

    • 感谢您的回复!所以我不能直接在我的 AppDelegate 中捕获关键事件?我必须绝对继承 WebView?我想如果不是击键不会被 WebView 捕获。我对 XCode 开发人员有点生疏,但我会再次检查如何进行子类化,我会按照你的指示进行操作。再次感谢!非常感谢:)
    • Application Delegate 不会下降也不会接收任何 NSResponder 方法,因此捕捉按键事件的正确位置是 NSResponder 操作发生的当前焦点视图。让我知道您的子类化是否成功!
    • 这很完美!现在我必须找到如何回调 AppDelegate 来告诉隐藏/显示其他 webview。对此有任何想法吗?我需要控制其他 webviews 的可见性。再次感谢!
    • 这是一个单独的(和新的)问题,但也许您可以让其他子类 WebView 监听您创建的 NSNotification 以隐藏和显示自己。
    • 哇哦,我又迷路了,呵呵。我会去查看有关 NSNotifications 的文档。谢谢:)
    【解决方案2】:

    不要担心它们是什么视图。 将每个选项卡放在 NSTabView 的选项卡中,显示或不显示选项卡控件。

    使用选项卡控制,在 IB 中为每个选项卡设置所需的组合键。

    无论有没有它,在菜单栏中的菜单中为每个具有相同组合键的选项卡创建一个菜单项。这是很久以前推荐的方式。 Apple 建议为具有键盘快捷键的所有内容添加菜单栏菜单项。菜单栏将首先接收键。

    【讨论】:

      猜你喜欢
      • 2020-08-31
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      相关资源
      最近更新 更多