Como lidar com o socorrista e um NSPopover
Estou tentando replicar o comportamento do campo de pesquisa no iTunes para procurar símbolos e nomes de ações. Especificamente, quando você começa a digitar no campo de pesquisa, aparece um popover com os itens filtrados. Na maioria das vezes, eu tenho esse trabalho, no entanto, o que não consigo replicar é a maneira como ele lida com o socorrista
Minha popover é exibida após a inserção de três caracteres. Nesse ponto, o NSSearchField perderia o status de socorrista e, portanto, não poderia mais continuar digitando. O comportamento que eu gostaria é a capacidade de continuar digitando depois que o popover aparecer, se percorrer os itens com as teclas de seta e, em seguida, retomar a digitação, você continuará do último caractere no campo Pesquisar.
O que eu tentei é subclassificar NSTextView (use isso como o editor de campo personalizado para o NSSearchField) e substituir
- (BOOL)resignFirstResponder
Simplesmente retornando NÃO, posso continuar digitando assim que o popover aparecer, mas obviamente não consigo selecionar nenhum dos itens no popover. Então, tentei o seguinte, que retorna SIM se ocorrer a seta para baixo ou um evento de redução do mouse.
@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];
}
Isso funciona para o evento mousedown, mas não para o evento keydown; além disso, isso não soluciona o problema quando o usuário retoma a digitação.
Alguma sugestão?