Cocoa 防止QLViewView获取焦点

Cocoa 防止QLViewView获取焦点,cocoa,quicklook,Cocoa,Quicklook,我有一份文件清单。在它旁边我有一个QLEVIEWVIEW,它显示了当前选择的文件 不幸的是,QLPreviewView加载了一个web视图来预览书签文件。有些网页可以抓住键盘焦点。例如,Gmail登录表单将插入点放在用户名字段中 这会中断我的应用程序流程。我想使用箭头键浏览我的列表。当键盘焦点从表视图中移开时,这会中断 到目前为止,我能想到的最好方法是重写-[NSWindow makeFirstResponder:],而不是为使用QL前缀命名的类的实例调用super。恶心 有没有更合理的方法

我有一份文件清单。在它旁边我有一个QLEVIEWVIEW,它显示了当前选择的文件

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

这会中断我的应用程序流程。我想使用箭头键浏览我的列表。当键盘焦点从表视图中移开时,这会中断

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

有没有更合理的方法

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

也许您可以将QLPreviewView子类化,并覆盖它的
成为第一响应程序
,以便在应用程序允许它接受焦点时启用或禁用它

标题 @接口MyQLPreviewView:QLPreviewView

@end
实施 @实施

- (BOOL)becomeFirstResponder
{
    return NO;
}

@end

我最终使用了一个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];
}

它是QLWeb2View类的私有子视图,成为第一响应者。我试过了,但没能成为第一反应者。我也不知道QLPreviewView还能提供哪些私有子视图conjure@PierreBernard这就是您试图成为第一响应者的方式吗?NSStringFromClass(@“QLWeb2View”)的结果为零