我在我的應用程序中有一個NSTokenField。當我點擊完成列表中的其中一條建議時,我希望列表消失並且完成標記(例如郵件)。但是,這似乎並未發生 - 單擊建議只會追加剩餘部分字符串和列表不會消失。單擊項目時關閉NSTokenField完成列表?
如果按回車鍵,完成列表會消失,但我希望通過單擊建議來解除它。我怎樣才能做到這一點?
我在我的應用程序中有一個NSTokenField。當我點擊完成列表中的其中一條建議時,我希望列表消失並且完成標記(例如郵件)。但是,這似乎並未發生 - 單擊建議只會追加剩餘部分字符串和列表不會消失。單擊項目時關閉NSTokenField完成列表?
如果按回車鍵,完成列表會消失,但我希望通過單擊建議來解除它。我怎樣才能做到這一點?
我發現了這個問題的解決方案,但這並不完美,但我希望我很快就能解決上一個問題。
我在使用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
感謝@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;
...
...
}
你找到一個解決問題了嗎? – siekfried 2013-06-14 10:14:19