2013-02-13 13 views
5

Mam NSTokenField w mojej aplikacji. Kiedy kliknę jedną z sugestii z listy uzupełnień, chciałbym, aby lista zniknęła, a token do wypełnienia (np. Poczta). Jednak to się nie dzieje - kliknięcie sugestii powoduje dołączenie pozostałej części ciąg znaków i lista nie zniknie.Po kliknięciu elementu zamknij listę wypełnień NSTokenField?

Lista uzupełnień zniknie, jeśli naciśnie klawisz Return, ale chcę, aby została ona odrzucona również przez kliknięcie sugestii. Jak mogę to osiągnąć?

+2

Czy znaleźć rozwiązanie swojego problemu? – siekfried

Odpowiedz

4

Znalazłem rozwiązanie tego problemu, który nie jest jeszcze doskonały, ale mam nadzieję, że wkrótce rozwiążę ostatni problem, który mam.

Używam rubymotion i nawet jeśli mogę przetłumaczyć Objective-C w Ruby, nie jestem w stanie zrobić odwrotnie, więc moja odpowiedź będzie w Ruby. Zapraszam do edycji mojej odpowiedzi, aby dodać odpowiedni kod Objective-C.

W delegacie mojego NSTokenField użyłem metody controlTextDidChange z NSControl, która jest wywoływana za każdym razem, gdy piszę znak w polu tokenu. W tej metodzie sprawdzam, czy jest wywoływane zdarzenie NSLeftMouseUp, a jeśli tak, to symuluję kliknięcie na Return (dowiedziałem się z tego drugiego SO question). I to wszystko.

Oto mój kod Ruby:

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

Ale tak jak mówiłem, to nie jest jeszcze doskonała: mój problem jest, że jeśli mam listę zakończenia z 3 elementów na przykład, jeden z nich będzie być domyślnie wybranym, powiedzmy pierwszy. W takim przypadku moje rozwiązanie będzie działać zgodnie z oczekiwaniami, jeśli kliknę drugi lub trzeci element, ale będę musiał dwukrotnie kliknąć pierwszy element, aby działał.

Ale nadal jest to dobry początek i mam nadzieję, że to pomoże!

EDIT

Aby rozwiązać ten ostatni problem miałem, ja wyłączyłem autouzupełnianie i wyświetlane tylko pole sugestii. Aby to zrobić, dodałem tę linię do sposobu tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem::

selectedIndex[0] = -1 
+0

Próbowano dodać kod Objective-C na odpowiedź, ale moje edycje są odrzucane ... = ( – rocky

+0

if ([[NSApplication sharedApplication] currentEvent] .typ == NSLeftMouseUp) { CGEventPost (kCGSessionEventTap, CGEventCreateKeyboardEvent (nil , 0x24, true)); } – Kappe

0

Dzięki @siekfried!

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

działa bardzo dobrze;)

aby uniknąć pierwszy element automatyczny dobór dodać to do swojego delegata:

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