アプリにNSTokenFieldがあります。完了リストから提案の1つをクリックすると、リストが消えてトークンが完了したい(メールなど)が、これは発生していないようです。提案をクリックすると、残りの部分が追加されるだけです。文字列とリストは消えません。
Returnキーを押すと完了リストが消えますが、提案をクリックして完了リストを閉じたいです。どうすればこれを達成できますか?
アプリにNSTokenFieldがあります。完了リストから提案の1つをクリックすると、リストが消えてトークンが完了したい(メールなど)が、これは発生していないようです。提案をクリックすると、残りの部分が追加されるだけです。文字列とリストは消えません。
Returnキーを押すと完了リストが消えますが、提案をクリックして完了リストを閉じたいです。どうすればこれを達成できますか?
この問題の解決策を見つけましたが、まだ完全ではありませんが、最後の問題をすぐに解決できることを願っています。
私は rubymotion を使用していますが、 で翻訳Objective-C
できRuby
ても、その逆はできないので、 で回答しRuby
ます。私の回答を自由に編集して、対応するObjective-C
コードを追加してください。
my のデリゲートでは、トークン フィールドに文字を書き込むたびに呼び出されるcontrolTextDidChangeメソッドNSTokenField
を使用しました。このメソッドでは、トリガーされたイベントがあるかどうかを確認し、その場合はクリックをシミュレートします(この他のSO の質問から学びました)。以上です。NSControl
NSLeftMouseUp
Return
これが私の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 つのアイテムを含む補完リストがある場合、そのうちの 1 つがデフォルトで選択されることです。最初のアイテムとしましょう。この場合、ソリューションは 2 番目または 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;
...
...
}