2013-02-13 7 views
5

Ich habe ein NSTokenField in meiner App. Wenn ich auf einen der Vorschläge aus der Liste der Vervollständigungen klicke, möchte ich, dass die Liste verschwindet und der Token vervollständigt wird (wie Mail). Dies scheint jedoch nicht zu geschehen - ein Klick auf einen Vorschlag fügt nur den Rest der Liste hinzu String und die Liste verschwindet nicht.Schließen Sie die NSTokenField-Vervollständigungsliste, wenn auf ein Objekt geklickt wird?

Die Completion-Liste verschwindet, wenn ich Return drücke, aber ich möchte, dass sie auch durch Klicken auf einen Vorschlag ausgeblendet wird. Wie kann ich das erreichen?

+2

Haben Sie eine Lösung für Ihr Problem finden? – siekfried

Antwort

4

Ich habe eine Lösung für dieses Problem gefunden, die noch nicht perfekt ist, aber ich hoffe, dass ich das letzte Problem, das ich habe, bald lösen werde.

Ich benutze Rubymotion und auch wenn ich Objective-C in Ruby übersetzen kann, bin ich nicht in der Lage, das Gegenteil zu tun, so wird meine Antwort in Ruby sein. Fühlen Sie sich frei, meine Antwort zu bearbeiten, um den entsprechenden Objective-C Code hinzuzufügen.

In der Delegierten von meiner NSTokenField, habe ich die controlTextDidChange Methode von NSControl, die aufgerufen wird, wenn ich ein Zeichen in meinem Token-Feld schreibe. In dieser Methode überprüfe ich, ob es ein Ereignis gibt, das ausgelöst wird, und wenn es der Fall ist, simuliere ich einen Klick auf Return (gelernt von diesem anderen SO question). Und das ist es.

Hier ist mein Ruby Code:

def controlTextDidChange(aNotification) 
    application = NSApplication.sharedApplication 
    event = application.currentEvent 
    if event.type == NSLeftMouseUp 
    e1 = CGEventCreateKeyboardEvent(nil, 0x24, true) 
    CGEventPost(KCGSessionEventTap, e1) 
    end 
end 

Aber wie ich Ihnen gesagt, es ist noch nicht perfekt: Mein Problem ist, dass wenn ich eine Vervollständigungsliste mit 3 Einträgen zum Beispiel einer von ihnen wird standardmäßig ausgewählt sein, sagen wir die erste. In diesem Fall funktioniert meine Lösung wie erwartet, wenn ich auf den zweiten oder dritten Eintrag klicke, aber ich muss auf den ersten Eintrag doppelklicken, damit er funktioniert.

Aber immer noch, es ist ein guter Anfang und ich hoffe, es wird helfen!

EDIT

das letzte Problem zu beheben, die ich hatte, drehte ich die Auto-Vervollständigung ab und nur den Vorschlag Feld angezeigt. Dazu habe ich diese Zeile in der tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem: Methode:

selectedIndex[0] = -1 
+0

Versuchte in der Objective-C-Code in Ihre Antwort, aber meine Änderungen werden abgelehnt ... = ( – rocky

+0

if ([[NSApplication shared] currentEvent] .type == NSLeftMouseUp) { CGEventPost (kCGSessionEventTap, CGEventCreateKeyboardEvent (nil hinzufügen , 0x24, wahr)); } – Kappe

0

Dank @ siekfried!

- (void)controlTextDidChange:(NSNotification *)aNotification; 
{ 
    if([[NSApplication sharedApplication]currentEvent].type == NSLeftMouseUp) 
    { 
     CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(nil, 0x24, true)); 
    } 
} 

funktioniert wirklich gut;)

das erste Element automatische Auswahl fügen Sie diese zu Ihrer Delegierten zu vermeiden:

-(NSArray *)tokenField:(NSTokenField *)tokenField completionsForSubstring:(NSString *)substring indexOfToken:(NSInteger)tokenIndex indexOfSelectedItem:(NSInteger *)selectedIndex 
{ 
    *selectedIndex = -1; 
... 
... 
}