2012-02-29 25 views
1

動的データの表示にカスタムデータオブジェクトを使用するNSTokenFieldを実装しました。デリゲートは正常にセットアップされ、トークンの正しい値が表示されます。内容をプログラムで変更した後にNSTokenFieldを更新する

また、トークンの表示に使用する形式を選択できるメニューを実装しました。しかし、私の問題は、NSTokenFieldがこれらの変更に即座に応答し、新しく選択されたフォーマットでトークンを再描画することができないことです。

NSTokenFieldの外側をクリックすると、最初のレスポンダを辞退するのですぐに再描画されます。最初のレスポンダーを明示的にnilに設定することで、これをプログラムで行うこともできます。これの唯一の問題は、NSTokenFieldがフォーカスを失い、最初のレスポンダーがフィールド内のすべてを選択してユーザーが誤ってコンテンツ全体を上書きする可能性があるため、NSTokenFieldがフォーカスを失うことです。

私の質問は、フォーカスと選択を変更せずにNSTokenFieldでコンテンツを再描画する方法があるかどうかです。

答えて

1

私は同じ問題を抱えていましたが、実行可能な唯一の解決策は、内容が変更されるたびにトークンフィールドを「リセット」することでした。基本的に、これはトークンフィールドでビューを扱うビューコントローラの以下の方法を実行する煮詰め:

- (void) resetTokenField { 

    // Force the token field to redraw itself by resetting the represented object. 

    id anObject = [self representedObject]; 
    [self setRepresentedObject: nil]; 
    [self setRepresentedObject: anObject]; 
    [[self tokenField] setNeedsDisplay: YES]; 

} 

表されるオブジェクトが表示されているすべてのトークンを保持するオブジェクトです。私の場合、それはトークンが基本的にタグであるリッチテキストの塊でした。

私はNSTokenFieldが首の王様の痛みであることがわかりましたが、私はそれの提示側がとても好きなので辛抱強くなりました。

EDIT:マイトークンフィールドは、ビューコントローラの表現されたオブジェクトのtagsAsArrayメソッドにバインドされました。だから基本的に私は問題を解決するためにCocoaバインディングを使用しました。

+0

ありがとうございます、私はあなたの提案を後日撮影します。あなたのRoyal PITAに完全に同意してください;) –

+0

あなたの解決策をちょうどチェックして、[tokenField setRepresentedObject:nil];応答のオンとオフを切り替えることと同じ副作用があります。つまり、トークンフィールド全体を選択します。 –

+1

あなたの解決策に基づいて回避策を見つけました:[tokenField setObjectValue:[NSArray arrayWithArray:[tokenField objectValue]]];同じ値を設定して新しい配列内に設定すると、選択の副作用なしにトークンの再描画がトリガーされるようです。アップルがよりクリーンなソリューションを提供する必要がある、ちょっと汚れたハックだ。しかし、とにかく、それが私を受け入れられる解決策に導くように私はあなたの答えを受け入れるだろう。 –

-1

NSTokenField自体でsetNeedsDisplayを呼び出すのではなく、NSTokenFieldで使用されるNSTextViewオブジェクトでsetNeedsDisplayを呼び出すことになっていることが判明しました。 次のコードが動作します。(PyObjCで書かれています)

text_view = token_field.cell().fieldEditorForView_(token_field) 
text_view.setNeedsDisplay_(YES) 
関連する問題