防止QLPreviewView抓住焦点

时间:2014-09-01 14:52:59

标签: cocoa quicklook

我有一个文件列表。在它旁边,我有一个QLPreviewView,显示当前选择的文件。

不幸的是,QLPreviewView加载Web视图以预览书签文件。一些网页可以抓住键盘焦点。例如。 Gmail登录表单将插入点放入用户名字段。

这打破了我的应用程序的流程。我想使用箭头键导航我的列表。当从表格视图中取出键盘焦点时,这会中断。

到目前为止,我能想到的最好的方法是覆盖 - [NSWindow makeFirstResponder:]而不是为使用QL前缀命名的类的实例调用super。呸。

是否有更合理的方式

  • 防止对第一响应者进行不必要的更改?
  • 或阻止用户在QLPreviewView及其子视图上进行互动?

2 个答案:

答案 0 :(得分:0)

也许您可以继承QLPreviewView并覆盖其becomeFirstResponder,以便在应用程序允许其接受焦点时启用或禁用它。

标题     @interface MyQLPreviewView:QLPreviewView

@end

实施     @implementation

- (BOOL)becomeFirstResponder
{
    return NO;
}

@end

答案 1 :(得分:0)

我最终使用了NSWindow子类,它允许QLPreviewViews及其私有子视图成为用户交互的第一响应者,但阻止这些视图简单地窃取焦点。

- (BOOL)makeFirstResponder:(NSResponder *)aResponder
{
    NSString *classname = NSStringFromClass([aResponder class]);

    // This is a hack to prevent Quick Look from stealing first responder
    if ([classname hasPrefix:@"QL"]) {
        BOOL shouldMakeFirstRespnder = NO;
        NSEvent *currentEvent = [[NSApplication sharedApplication] currentEvent] ;
        NSEventType eventType = currentEvent.type;

        if ((eventType == NSLeftMouseDown) || (eventType == NSRightMouseDown) || (eventType == NSMouseEntered)) {
            if ([aResponder isKindOfClass:[NSView class]]) {
                NSView *view = (NSView *)aResponder;
                NSPoint locationInWindow = currentEvent.locationInWindow;
                NSPoint locationInView = [view convertPoint:locationInWindow fromView:nil];
                BOOL pointInRect = NSPointInRect(locationInView, [view bounds]);

                shouldMakeFirstRespnder = pointInRect;
            }
        }

        if (!shouldMakeFirstRespnder) {
            return NO;
        }
    }

    return [super makeFirstResponder:aResponder];
}