2013-02-13 58 views
5

我在我的應用程序中有一個NSTokenField。當我點擊完成列表中的其中一條建議時,我希望列表消失並且完成標記(例如郵件)。但是,這似乎並未發生 - 單擊建議只會追加剩餘部分字符串和列表不會消失。單擊項目時關閉NSTokenField完成列表?

如果按回車鍵,完成列表會消失,但我希望通過單擊建議來解除它。我怎樣才能做到這一點?

+2

你找到一個解決問題了嗎? – siekfried 2013-06-14 10:14:19

回答

4

我發現了這個問題的解決方案,但這並不完美,但我希望我很快就能解決上一個問題。

我在使用rubymotion,即使我可以在Ruby中翻譯Objective-C,但我無法做相反的操作,所以我的答案將在Ruby。隨意編輯我的答案,添加相應的Objective-C代碼。

在我的NSTokenField的代表中,我使用了controlTextDidChange方法NSControl,我隨時在我的令牌字段中寫入一個字符時調用該方法。在這種方法中,我檢查是否有NSLeftMouseUp事件被觸發,如果是這種情況,我模擬點擊Return(從其他SO question瞭解到)。就是這樣。

這裏是我的Ruby代碼:

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

但是就像我告訴你,這不是很完美:我的問題是,如果我有3個項目,例如,其中一人將完成列表中被默認選中,比如說第一個。在這種情況下,如果我單擊第二個或第三個項目,我的解決方案將按預期工作,但我必須雙擊第一個項目才能使其工作。

但是,這仍然是一個好的開始,我希望它會有所幫助!

編輯

要解決的最後一個問題我有,我關掉自動完成,只顯示了意見箱。要做到這一點,我添加了此行的tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:方法:

selectedIndex[0] = -1 
+0

試圖將Objective-C代碼添加到您的答案中,但是我的編輯被拒絕... =( – rocky 2013-09-09 21:03:16

+0

if([[NSApplication sharedApplication] currentEvent] .type == NSLeftMouseUp) {CGEventPost(kCGSessionEventTap,CGEventCreateKeyboardEvent ,0x24,true)); } – Kappe 2014-02-11 10:46:46

0

感謝@siekfried

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

作品真的很好;)

,以避免第一要素自動選擇添加到您的委託:

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