【问题标题】:Closing frontmost window in Cocoa in an app without a menu bar在没有菜单栏的应用程序中关闭 Cocoa 中的最前面窗口
【发布时间】:2011-05-21 18:47:36
【问题描述】:

我正在 Cocoa 中构建一个 StatusBar 应用程序,因此我没有菜单。没有菜单意味着没有“文件 > 关闭”菜单项,该菜单项通常侦听快捷键“Command + W”。

从我的状态栏应用程序中,用户可以打开一个窗口来更改首选项,这就是我遇到问题的地方:用户可以通过用鼠标按下红点来关闭窗口。但是,像所有应用程序一样,我也希望支持“Command + W”快捷键。

目前我看到解决此问题的两种可能性:

  1. 在监听快捷方式的窗口上放置一个不可见的按钮。
  2. 为快捷方式添加应用程序范围的侦听器并手动联系窗口。

这两种解决方案都像是对系统的滥用。第一个解决方案可能会导致意外行为(如果用户偶然点击了不可见按钮,窗口会关闭),而第二个解决方案仍会导致哔声,因为窗口不知道它处理了这样的快捷方式。

有没有优雅的方法来解决这个问题?由于视图应该知道该做什么,因此仅使用 Interface Builder 的解决方案将是完美的。如果没有优雅的方法,有没有办法增强提到的解决方案?

提前致谢!

【问题讨论】:

    标签: objective-c cocoa keyboard-shortcuts statusbar menubar


    【解决方案1】:

    如果您在 MainMenu nib 中放置一个 File > Close 菜单项,即使菜单不可见,快捷方式也将起作用。

    如果您选择为快捷方式实现应用范围的侦听器,则可以通过从块中返回 nil 来消除哔声,这样原始事件就不会被传递。

    【讨论】:

    • 非常感谢!很高兴知道菜单栏是不可见但“可用”的。我还了解到您无法重新创建菜单栏,因此我不想从另一个应用程序中复制它。 (我删除了它,因为从我的角度来看它是无用的混乱。)-顺便说一句:摆脱哔哔声不起作用,因为该块具有不允许的签名 (NSEvent* (^)(NSEvent*))我返回 nil 或 NULL。如果您找到正确的解决方案,我会很感兴趣。学习新东西总是好的。 :) 再次感谢!
    • @Florian:允许从该事件处理程序返回nil;这会阻止事件被进一步分派。在description of the block argument 中是这样写的。
    • @Josh:你说得对,NSEvent 方法的文档说可以返回 nil。但是,以下代码无法在我的机器上编译:[NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *theEvent) { return nil; }];。编译错误是error: incompatible block pointer types initializing 'void * (^)(struct NSEvent *)', expected 'struct NSEvent * (^)(struct NSEvent *)'。有什么想法吗?
    • @Florian:您声明该块具有 void 返回类型;它需要有一个NSEvent * 返回。 handler:^NSEvent * (NSEvent *theEvent) { return nil; }];
    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多