9

私は、ユーザの好みを表し、NSStringNSNumberをカプセル化する単純なモデルFooを持っています。私はFooの配列をユーザのデフォルト値に保存して、アプリケーションの起動間に持続するようにしたい。ユーザーが追加、削除、編集できるように、テーブルビューで表示したいと考えています。これに対する解決策は、バインディングではかなり単純に思えましたが、私が実際に作業することは不可能であることが証明されています。NSUserDefaultsControllerにバインドされたNSArrayControllerにバインドされた編集可能なテーブルビュー

私のアプリケーションが起動すると、NSUserDefaultsに登録されています。Fooの配列のキー付きアーカイブです。私のXIBには、コンテンツの配列が共有ユーザーデフォルトコントローラのvaluesコントローラキーにバインドされたアレイコントローラがあります。キーパスはfoosです。 '複合値としてのコンテンツの処理'がチェックされました。値トランスフォーマとしてNSKeyedUnarchiveFromData。次に、テーブルビューはアレイコントローラーと表の列にバインドされ、Fooのプロパティーにバインドされます。

Fooがアレイに追加され、アレイから削除されると、これは完全に機能します。foosユーザーのデフォルトのキーは、アレイの新しい内容を反映するように更新されます。問題は、個々のプロパティの変更をFooは、ユーザーの既定値に書き戻される配列を同様にトリガしないことです。この理由は、「Key-Value Observing Programming Guide」の「Dependent Keysの登録」の「To-many Relationships」のセクションで説明されていると考えられます。アレイコントローラの配列自体の変更はありますが、 。

これを問題として認識したにもかかわらず、私の人生にとっては、この仕事をするために実際に何をするべきかを理解できません。 Fooの変更を観察すると、通知する必要があるメッセージと、アレイ全体がユーザーのデフォルトに書き戻されるようなメッセージである-NSUserDefaultsNSUserDefaultsControllerNSArrayController?アップルのマニュアルには、この問題の簡単な説明以上のものがあり、それを解決するための実際のサンプルコードが用意されています。私はすべてを試しましたが、私は魔法の呪文を見つけることができません。

これはHow to get notified of changes to models via an NSArrayControllerと似ていますが、私がカスタムビューでやっていることと、bind:toObject:withKeyPath:options:の使用の間で概念的な飛躍をすることはできません。

ありがとうございます! :)

+0

これは実際にNSUserDefaultsではなくCoreDataの仕事のようです。 –

+0

あなたは精巧にできますか? CoreDataでこれを実装することさえ消化するために必要なドキュメントの量を考えてみると、頭痛がでてきます。データモデルの観点から、私がしようとしていることは、非常に簡単なようです.ColumnDataの複雑さを考えると、ここでは過度のようです。 –

+0

よくあるユーザーのデフォルトは設定のためのもので、あなたはそれを使ってあなたのデータモデルを保存しようとしています。あなたが本当にシンプルなデータモデルを持っていれば、CoreDataは本当に難しいことではありません。 xcodeには、基本的にすべての設定を行うプロジェクトテンプレートがあります。あなたが説明する問題も解決するはずです。 –

答えて

0

私はiOSの開発者ですので、私がココアのバインディングをサポートしていないiOSのために欠けているということがある場合、私は許してください。

Fooのプロパティが変更されたときに通知を受け取って、foos配列の変更を通知してNSUserDefaultsが保存された配列を更新できるようにするかのように聞こえるように聞こえます。あれは正しいですか?

あなたが言ったように、配列そのものを変更すると(すなわち、Fooの内部の 'foos'を追加/削除すると、変更が正常に通知されているということを前提としています)、あなたがする必要があることは、

これを行うには、プロパティが変更されたときにKVO通知を発する必要があります。基本的には、Foo内の設定者を無効にする必要があります

しかし、どうやってこれを行うのですか?KVO通知を送信するために通常のパターンがopeningBalanceと呼ばれるプロパティのため(のように行く:

[self willChangeValueForKey:@"openingBalance"]; 
_openingBalance = theBalance; 
[self didChangeValueForKey:@"openingBalance"]; 

しかし、あなたの場合には、あなたは、プロパティ「FOOS」はFooの上のプロパティを変更し、そのされていないという通知を送りたいです。私が気づいているのは、特定のプロパティ(または少なくとも私が気づいていないもの)だけであるということは何もありませんが、おそらくFooはそれがどこかの 'foos'プロパティの中に構成されていることを知りたくありませんそうでなければ、まっすぐなNSNotificationを使用するのはどうでしょうか?Foo内の更新された通知を呼び出すための一般的なメソッドを作成し、セッターをサブクラス化し、Fooプロパティを変更するたびにこの通知を発行します。

「foos」を所有するオブジェクト内でこの通知を購読し、そこからNSUserDefaultsを直接更新するか、そこから「foos」のKVO通知をオフにします。

関連する問題