0

NSDictionariesの配列と、配列のオブジェクトの1つを指すNSDictionary iVar(* selectedDictionary)があります。* selectedDictionaryは、ユーザーがNSTableViewで別の行を選択するたびに、別のオブジェクトを指します。いくつかのGUIコントロールは、selectedDictionaryインスタンス(IB)にバインドされています。

ユーザーが上記のコントロールを変更するたびに、NSDocumentをダーティ(編集)にしたいだけです。配列内のすべてのオブジェクトとそのすべてのケイパスにKeyValueObservingを使用するのは、少し不十分だと思います。助言がありますか?

ありがとう

4

1 に答える 1

0

ドキュメントをダーティとしてマークするための NSDocument のサポートは、NSUndoManager から直接提供されます。ドキュメントをダーティに変更する最も簡単な方法は、元に戻すの実装を行うことです。これは基本的に、ドキュメントが使用しているモデル クラス (または、すべてのストレージを処理することを選択した場合は NSDocument のサブクラス) 内で元に戻すことを意味します。そこに直接)。

Apple にはこれに関するドキュメントがあります: http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/UndoArchitecture/Articles/AppKitUndo.html

辞書の配列があることを示しているので、実装するのにもう少し手間がかかりますが、それをうまくやれば、良い状態になります。

あるいは、NSDocument と NSUndoManager が提供する景品サポートを利用したくない場合は、元に戻す操作を手動で処理し、updateChangeCount:メソッドを使用して、変更が発生したかどうかの内部理解を変更することができます。これには多少の作業が必要であり、元に戻すを正しく設定するよりもはるかに役に立たない可能性があります。

配列内のすべてのオブジェクトを監視する効率については、プロファイルを作成して非効率的であることが判明しない限り、心配する必要はありません。KVO は非常に効率的であり、パフォーマンスの問題を確認することなく、配列のすべての要素で複数の値を定期的に観察します。追加と削除を処理するには、配列自体を監視する必要があります (配列にこれがあると仮定します)。

ただし、私が知る限り、selectedDictionary表示される他のコントロールを決定するために使用される があります。この場合、KVO を使用して selectedDictionary の値を監視できます。値が変更されたら、以前の selectedDictionary からオブザーバーを削除して、現在の selectedDictionary のキーに追加できます。とにかく、これは基本的にバインディングが表示と設定を処理するために行っていることです。

私が過去に使用したもう 1 つの考慮事項は、この StackOverflow の投稿で参照されています: NSMutableDictionary KVO。ここで私の回答を見ると、新しいキーが追加されたとき、または既存のキーが削除されたときに通知を受け取るためのトリックの概要が説明されています。また、変更があったときに通知を受け取るという利点もあります。これは必ずしも優れた解決策ではありませんが、監視するキーのリストをコーディングする手間を省くことができます。

さらに、ドキュメントの保存状態に影響を与えると予想されるすべてのキーを追加する必要があります。

于 2012-05-25T18:28:14.367 に答える