我有一个文件列表。在它旁边,我有一个QLPreviewView,显示当前选择的文件。
不幸的是,QLPreviewView加载Web视图以预览书签文件。一些网页可以抓住键盘焦点。例如。 Gmail登录表单将插入点放入用户名字段。
这打破了我的应用程序的流程。我想使用箭头键导航我的列表。当从表格视图中取出键盘焦点时,这会中断。
到目前为止,我能想到的最好的方法是覆盖 - [NSWindow makeFirstResponder:]而不是为使用QL前缀命名的类的实例调用super。呸。
是否有更合理的方式
答案 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];
}