我正在尝试复制iTunes中搜索字段的行为,以查找股票代码和名称。具体来说,当您开始在搜索字段中键入时,会显示带有过滤项的弹出窗口。在大多数情况下,我有这个工作,但我无法复制的是它处理第一响应者的方式
输入三个字符后,我的弹出窗口出现了。此时,NSSearchField将失去第一响应者状态,因此我无法继续键入。我想要的行为是 弹出窗口后出现继续键入的能力 如果使用箭头键滚动项目,然后继续键入,您将从搜索字段中的最后一个字符继续。
我尝试的是继承NSTextView(使用它作为NSSearchField的自定义字段编辑器)并覆盖
- (BOOL)resignFirstResponder
只需返回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];
}
这适用于mousedown事件,但不适用于keydown事件,此外,当用户恢复输入时,这不能解决问题。
有什么建议吗?
答案 0 :(得分:0)
与此同时,我找到了一个简单的方法。对文本视图进行子类化并实现- (BOOL)canBecomeKeyView
。总是在那里返回NO。当弹出窗口显示时,它只会被调用一次。您可以随时使用文本视图。