2017-11-18 3 views
0

私はいくつかのNSTextFieldを含むCocoaアプリケーションを作成しています。テキストフィールドのテキストの変更をモデルレイヤーに伝播しようとしていますが、モデルが更新されたときに元に戻すアクションを登録しているので、これは単にcontrolTextDidChange:をリッスンするよりも少し複雑です。NSTextFieldは融合を編集します

デリゲートメソッドcontrolTextDidChange:にフックすると、押されたキーごとに1回呼び出されます。モデルを更新すると、モデルは別々のキー押しを個別の元に戻すイベントとして扱います。これは望ましくない。デフォルトの「入力を元に戻す」アクションが「元に戻す」マネージャーに登録されているときに通知を受けるので、モデルを更新できます。 NSTextFieldは、入力を一時停止するとそのようなイベントを登録します(そして1つだけ)。残念ながら、私はこれがいつ起こるか分かりません。

私はcontrolTextDidEndEditing:をリッスンして、そのデリゲートメソッドでモデルを更新しようとしましたが、モデルが更新される前にテキストフィールドから明示的にタブを外す必要があります。私のモデルオブジェクトを私のNSDocumentサブクラスに直接アーカイブするので、これを行うと、テキストフィールドの内容を変更した後にドキュメントを保存するとデータが失われますが、最初にテキストフィールドからタブアウトしません。モデルは時間内に更新されていないだろう。したがって、この手法は動作しません。

また、テキストフィールドのフィールドエディタ(control:textShouldBeginEditing:の間)にフックしてtextDidEndEditing:を聞いてみましたが、これは単に起動しないことがわかりましたので、モデルは更新されず、前の段落で述べた。誰も私がこれを理解するのを助けることができますか?ありがとう!

+0

「NSEditor」プロトコルを見てください。 – Willeke

+0

私は 'NSEditor'を見ましたが、バインディングを使用していないので(私のモデルアーキテクチャと互換性がないため)、私はView Controllerをワイヤリングする方法がわかりません(モデルを更新する責任があります)それはメッセージを受信します。 – wjk

答えて

0

デフォルトでは、Apple NSTextFieldはあなたが言及したようにぶら下がった編集を残します。 この問題のために、NSTextFieldとNSApplicationをサブクラス化して、テキストフィールドの編集を処理する必要がありました。「Enter」を押してフィールドの外側をクリックすると、他のアクションが編集を終了して元に戻すエントリを生成する必要があります。

また、GCUndoManagerをNSUndoManagerに置き換えることを強くお勧めします。

関連する問題