2013-06-21 61 views
3

我在我的應用程序的NSTokenField和我實現了我在其中指定接收器的標記化的字符集與setTokenizingCharacterSet:方法tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:方法:NSTokenField點擊完成列表項

def tokenField(tokenField, completionsForSubstring:substring, indexOfToken:tokenIndex, indexOfSelectedItem:selectedIndex) 
    tokenField.setTokenizingCharacterSet(NSCharacterSet.whitespaceAndNewlineCharacterSet) 
    end 

它的工作原理是,當我點擊預期空格鍵或輸入按鈕。當我用鼠標點擊完成列表中的某一項時,我也希望有相同的行爲。

這怎麼可能?

感謝您的幫助。

回答

3

我不知道是否有可能與NSTokenField有此行爲。

但你應該看看MTTokenField哪些做你想要的開箱即用。

要做到這一點,你必須:

1.創建一個Xcode項目作爲靜態庫(不要啓用ARC)。

2.Save你的項目的供應商/ MTTokenField

3.拖動和位於子目錄「MTTokenField」的MTTokenField的所有文件拖放到新的XCode項目。選擇複製文件。

4.將此添加到您的rakefile中,以便編譯和鏈接庫與您的Rubymotion項目。

app.vendor_project("vendor/MTTokenField/", :xcode, :xcodeproj => "MTTokenField.xcodeproj", :target => "MTTokenField", :products => ["libMTTokenField.a"], :headers_dir => "MTTokenField") 

5.In Interface Builder中更改類的NSTokenField到的NSTextField,然後設置其自定義類MTTokenField,同時也改變了自定義類細胞:MTTokenFieldCell代替NSTextFieldCell。

6.Then你有你的MTTokenField的委託設置爲一類具有迴應:

def tokenField(tokenField, completionsForSubstring: substring) 
    # your have to return an array containing your results matching substring. 
end 

就是這樣。它應該工作。

希望它有幫助!

+2

老兄,你太棒了!它完美的作品。 – siekfried

1

我發現了另一個解決方案,使用NSTokenField而不是MTTokenField

在我的NSTokenField的委託中,我使用NSControl的controlTextDidChange方法,在任何時候我在我的令牌字段中寫入一個字符時調用它。在這個方法中,我檢查是否有觸發的NSLeftMouseUp事件,如果是這種情況,我模擬一個點擊返回。就是這樣。

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

有一件事做,使之正常工作:這裏的問題是,如果我有3個項目,例如,其中一人將被默認選中完成列表中,假設第一一。在這種情況下,如果單擊第二個或第三個項目,解決方案將按預期工作,但我必須雙擊第一個項目才能使其工作。

要解決此問題,請關閉自動完成功能,並僅顯示建議框即i。e將此行添加到tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:方法:

selectedIndex[0] = -1 
+0

任何想法如何在Swift中做到這一點? – jpgr