2013-12-22 10 views
7

Ich versuche, das Verhalten des Suchfeldes in iTunes zu replizieren, um nach Vorratssymbolen und Namen zu suchen. Wenn Sie mit der Eingabe in das Suchfeld beginnen, wird ein Popover mit den gefilterten Elementen angezeigt. Zum größten Teil habe ich das funktioniert aber was ich nicht replizieren kann, ist die Art, wie es First Responder behandelt enter image description hereWie man mit Ersthelfer und einem NSPopover umgehen kann

Ich habe mein Popover erscheinen nach drei Zeichen eingegeben werden. An diesem Punkt würde das NSSearchField den First-Responder-Status verlieren und daher konnte ich nicht mehr weiter tippen. Das Verhalten, das ich möchte, ist die Fähigkeit, weiter zu tippen, nachdem das Popover erscheint, wenn Sie durch die Elemente mit den Pfeiltasten scrollen und dann weiterschreiben, würden Sie von dem letzten Zeichen in das Suchfeld fortfahren.

Was ich versucht wird Subklassen NSTextView (dies als das benutzerdefinierte Feld-Editor für die NSSearchField) und übergeordnete

- (BOOL)resignFirstResponder 

Durch einfache Rückkehr NEIN, ich auch weiterhin eingeben, sobald die popover erscheint, aber natürlich kann ich‘ t Wählen Sie eines der Elemente im Popover aus. Also habe ich folgendes versucht, was YES zurückgibt, wenn der Abwärtspfeil oder ein Mousedown-Ereignis auftritt.

@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]; 
} 

Dies funktioniert für die mousedown- Ereignis, aber nicht das Ereignis KeyDown, ferner ist dies nicht das Problem beheben, wenn der Benutzer die Eingabe fortgesetzt.

Irgendwelche Vorschläge?

+0

Haben Sie versucht, NSPopoverBehaviorApplicationDefined als Verhalten festzulegen. Ich denke, die anderen 2 Verhaltensweisen können sich darauf verlassen, dass der First-Responder-Switch das Popover ordnungsgemäß beendet. Außerdem nehme ich an, dass Sie bereits versucht haben, den ersten Responder-Status manuell auf das Textfeld zu setzen, nachdem das Popover erschienen ist. –

+0

@MikeLischke Wenn du "manuell" meinst, meinst du, auf das Suchfeld zu klicken, während die App läuft? Wenn ja, das funktioniert. oder meinst du mit etwas wie setNextResponder? – Cory

+0

nein ich meine 'NSWindow makeFirstResponder:'. Sie können dies aufrufen, nachdem Sie das Popover sichtbar gemacht haben (planen Sie es über 'performSelector: withObject: afterDelay: 0' in die nächste Run-Schleife ein). –

Antwort

0

In der Zwischenzeit habe ich eine einfache Lösung gefunden. Unterklassen Sie Ihre Textansicht und implementieren Sie - (BOOL)canBecomeKeyView. Gib immer NO zurück. Es wird nur einmal aufgerufen, wenn das Popover angezeigt wird. Sie können jederzeit mit der Textansicht arbeiten.

Verwandte Themen