如何处理第一响应者和NSPopover

Cor*_*ory 7 cocoa nsevent nsresponder nspopover

我正在尝试复制iTunes中搜索字段的行为,以查找股票代码和名称.具体来说,当您开始在搜索字段中键入时,会显示带有过滤项的弹出窗口.在大多数情况下,我有这个工作,但我无法复制的是它处理第一响应者的方式 在此输入图像描述

输入三个字符后,我出现了弹出窗口.此时,NSSearchField将失去第一响应者状态,因此我无法继续键入.我想要的行为是能够在弹出窗口后继续键入,如果使用箭头键滚动项目,然后继续键入,您将从搜索字段中的最后一个字符继续.

我尝试的是子类化NSTextView(使用它作为NSSearchField的自定义字段编辑器)和覆盖

- (BOOL)resignFirstResponder 
Run Code Online (Sandbox Code Playgroud)

通过简单地返回NO,我可以在弹出框出现后继续输入,但显然我无法选择弹出窗口中的任何项目.所以我尝试了以下操作,如果出现向下箭头或mousedown事件,则返回YES.

@interface SBCustomFieldEditor ()
{
    BOOL resignFirstRepond;
}
@end

@implementation SBCustomFieldEditor

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
        resignFirstRepond = NO;
    }
    return self;
}

- (BOOL)resignFirstResponder
{
    return resignFirstRepond;
}

- (void)keyDown:(NSEvent *)theEvent
{
    if ([theEvent keyCode] == 125) {
        resignFirstRepond = YES;
        [self resignFirstResponder];
    }
    [super keyDown:theEvent];
}

- (void)mouseDown:(NSEvent *)theEvent
{
    resignFirstRepond = YES;
    [self resignFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)

这适用于mousedown事件,但不适用于keydown事件,此外,当用户恢复键入时,这不能解决问题.

有什么建议?

Mik*_*hke 0

与此同时,我找到了一个简单的解决办法。将您的文本视图子类化并实现- (BOOL)canBecomeKeyView。始终返回“NO”。当弹出窗口显示时,它只会被调用一次。您可以随时使用文本视图。