5

アプリにNSTokenFieldがあります。完了リストから提案の1つをクリックすると、リストが消えてトークンが完了したい(メールなど)が、これは発生していないようです。提案をクリックすると、残りの部分が追加されるだけです。文字列とリストは消えません。

Returnキーを押すと完了リストが消えますが、提案をクリックして完了リストを閉じたいです。どうすればこれを達成できますか?

4

2 に答える 2

4

この問題の解決策を見つけましたが、まだ完全ではありませんが、最後の問題をすぐに解決できることを願っています。

私は ruby​​motion を使用していますが、 で翻訳Objective-CできRubyても、その逆はできないので、 で回答しRubyます。私の回答を自由に編集して、対応するObjective-Cコードを追加してください。

my のデリゲートでは、トークン フィールドに文字を書き込むたびに呼び出されるcontrolTextDidChangeメソッドNSTokenFieldを使用しました。このメソッドでは、トリガーされたイベントがあるかどうかを確認し、その場合はクリックをシミュレートします(この他のSO の質問から学びました)。以上です。NSControlNSLeftMouseUpReturn

これが私の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
于 2013-06-26T06:33:52.580 に答える
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;
...
...
}
于 2014-02-11T10:48:18.673 に答える