允许转义退出全屏,就像在Cocoa中一样

时间:2014-07-10 18:57:38

标签: objective-c macos cocoa

所以我在我的Cocoa / Mac应用程序中启用全屏模式,显然默认行为是你可以点击退出键退出全屏模式。我添加了一些NSTextViews(在NSScrollViews中),现在他们正在拦截转义键,我无法退出全屏。

对我来说,仍然允许转义键退出全屏并且不被我的NSTextViews拦截的最佳方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

Escape的默认键绑定是-cancelOperation:。在回应之后,NSTextView然后转身并发送自己-complete:来完成文本。

这是你按Escape时所看到的吗?文本视图是否可以完成您键入的任何文本?

要尝试的第一件事是通过在文本视图的委托中实施-textView:completions:forPartialWordRange:indexOfSelectedItem:并返回nil来禁用完成。

如果这不起作用,请实施-textView:doCommandBySelector:并将选择器与@selector(cancelOperation:)进行比较。如果不相等,请返回NO以允许正常处理。如果是,请尝试使用[[theTextView nextResponder] doCommandBySelector:theSelector]将其传递给响应者链。然后从委托方法返回YES以防止文本视图尝试处理它。

如果仍然不起作用,请通过测试[NSApp presentationOptions]是否包含NSApplicationPresentationFullScreen来检查应用是否处于全屏模式,而不是将其传递给响应者链。如果是,请通过设置一组正常的演示选项使其退出全屏模式。或者,您可以测试主窗口以查看其样式掩码是否包含NSFullScreenWindowMask,如果是,则在其上调用-toggleFullScreen:。同样,您将从委托方法返回YES以防止进一步处理。

答案 1 :(得分:0)

根据Ken的建议,这就是我最终要做的工作:

- (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
    if (commandSelector == @selector(cancelOperation:)) {
        if([self inFullScreenMode]) {
            [self.window toggleFullScreen:nil];
        }
    }
    else {
        return NO;
    }
    return YES;
}

- (BOOL) inFullScreenMode {
    NSApplicationPresentationOptions opts = [[NSApplication sharedApplication ] presentationOptions];
    if ( opts & NSApplicationPresentationFullScreen) {
        return YES;
    }
    return NO;
}