Cocoa 如何处理第一响应者和NSPOVER
我试图复制iTunes中搜索字段的行为,用于查找股票符号和名称。具体地说,当您开始在搜索字段中键入时,会出现一个带有筛选项的弹出窗口。在大多数情况下,我都能做到这一点,但我无法复制的是它处理第一响应者的方式 输入三个字符后,我的弹出框出现。此时,NSSearchField将失去first responder状态,因此我无法继续键入。我想要的行为是 在弹出框出现后继续键入的功能 如果使用箭头键滚动项目,然后继续键入,则从搜索字段中的最后一个字符开始继续 我尝试的是将NSTextView子类化(将其用作NSSearchField的自定义字段编辑器)并重写Cocoa 如何处理第一响应者和NSPOVER,cocoa,nsevent,nspopover,nsresponder,Cocoa,Nsevent,Nspopover,Nsresponder,我试图复制iTunes中搜索字段的行为,用于查找股票符号和名称。具体地说,当您开始在搜索字段中键入时,会出现一个带有筛选项的弹出窗口。在大多数情况下,我都能做到这一点,但我无法复制的是它处理第一响应者的方式 输入三个字符后,我的弹出框出现。此时,NSSearchField将失去first responder状态,因此我无法继续键入。我想要的行为是 在弹出框出现后继续键入的功能 如果使用箭头键滚动项目,然后继续键入,则从搜索字段中的最后一个字符开始继续 我尝试的是将NSTextView子类化(将
- (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事件,此外,当用户继续键入时,这并不能解决问题
有什么建议吗?与此同时,我找到了一个简单的解决办法。对文本视图进行子类化,并实现
-(BOOL)可以成为KeyView
。永远不要在那里返回。当显示popover时,它将只被调用一次。您仍然可以随时使用文本视图。是否尝试将NSPopVerbeHaviorApplicationDefined设置为行为。我认为其他两种行为可能依赖于第一响应器开关来处理正确关闭popover。此外,我假设您已经尝试在弹出框出现后将第一响应者状态手动设置为文本字段。@MikeLischke当您说“手动”时,是指在应用程序运行时单击搜索字段吗?如果是的话,是的,这是有效的。或者你的意思是使用像setNextResponder这样的东西?在这个问题上有进展吗?我也遇到了同样的问题。@Lukas我最终放弃了NSpover并使用了一个自定义窗口,我使用了这里的示例()以及WWDC会话145视频。@Cory谢谢。我还发布了一个问题,有人在这里提供了一个有效的答案: