3

アプリケーションで NSUserDefaults をサブクラス化しています。これの副作用は[NSUserDefaults sharedUserDefaults]、 を使用できないことです。独自の静的デフォルト オブジェクトを提供するクラス メソッドが必要です。これはコードの問題ではありませんが、バインディングを使用して設定 UI を接続しているため、難しいことがわかりました。

共有された NSUserDefaultsController は共有されたデフォルトを使用するので、それはありません。代わりに、ウィンドウ コントローラーに独自のデフォルト コントローラーを作成し、それに静的なデフォルト オブジェクトを提供して、それにバインディングを接続することができます。ただし、これは完全には機能しません。デフォルト オブジェクトで KVO を使用しようとしたときに、変更通知を受け取りませんでした。通常の NSUserDefaults オブジェクト (サブクラスではない) を使用してこれを再試行しましたが、KVO 通知はありませんでした。共有デフォルト オブジェクトを代用すると、KVO は私の期待どおりに機能します。

共有デフォルトを使用していないときにバインディングと KVO を機能させる方法について、誰かアイデアはありますか?

4

4 に答える 4

2

私は常にNSUserDefaultsのものを独自のカスタムクラスでラップして、すべてが期待どおりに機能することを確認します。

ワークフローは基本的に次のようになります。

  1. アプリケーションが起動したら、必要なすべてのNSUserDefaultsエントリをカスタムクラスに読み込みます。このカスタムクラスには各設定のプロパティがあり、すべてのNSDictionaryオブジェクトとNSArrayオブジェクトは変更可能であるため、変更を加えることができます。
  2. 設定を変更するユーザーインターフェイス要素はすべて、カスタムクラスのプロパティにバインドされます
  3. 設定への変更は、必要に応じてNSUserDefaultsに保存されます。

このアプリケーション設定のカプセル化は、すべての頭痛の種を取り除くのに役立つことがわかりました。Appleの魔法のNSUserDefaultsシステムを直接扱う代わりに、明確に定義され、簡単にテストできるカスタムクラスを操作することに時間を費やします。

于 2009-05-08T20:32:49.613 に答える
1

ドキュメントが答えを提供していると思います。このinitメソッドは新しいインスタンスを初期化しますが、検索パスには何も入れません。独自のインスタンスを初期化する場合は、使用するドメインを手動で設定する必要があります。私の推測では、値を保存するドメインがないため、取得/設定しようとしている値が存在しないため、アプリケーションが機能していない可能性があります。

特に、addSuiteNamed:メソッドとNSUserDefaultsDomain定数を見てください。NSUserDefaultsサブクラス、または以外のインスタンスをstandardUserDefaults適切に動作させるには、これらを手動で設定する必要があります。

于 2009-04-21T16:12:46.657 に答える
1

私は最近似たようなことをしていて、今のところかなり幸運です。標準の NSObject サブクラス (引数として MYUserDefaults) を作成します。必要なもの (ホスト、ユーザー名など) のプロパティがあります。一部は NSUserDefaults に移動し、一部はキーチェーンなどに移動します。標準の+sharedUserDefaultsシングルトンメソッドがあります。(*)

ウィンドウ所有者 (NSWindowController または AppDelegate) で、-sharedUserDefaults. 次に、単純なキーパス (sharedUserDefaults.host) を使用して、必要な設定にバインドします。キーパスは物事を難読化することが多いため、通常はバインディングでのキーパスを避けますが、ここでは、NIB が余分な非シングルトン バージョンを作成するのを防ぐ必要があるという特別なケースに対処しながら、すべてを明確に保つと思います。

(*) 派手な「強制シングルトン」のものはありません (問題を解決するかもしれません)。Apple が「必要な理由がわからない限り使用しないでください。とにかく使用しないでください」とこのドキュメントに署名する必要があると考えるのは私だけですか? そのコードを経験の浅い開発者に見せるのは危険だと思います。私が最後に取り組んだプロジェクトでは、オブジェクトの半分が+allocWithZone:オーバーロードされていました。私にとっては+alloc、 を呼び出して既存のオブジェクトへのポインターを取得するのは悪い形です。絶対に必要でない限り、私に嘘をつかないでください。

于 2009-05-21T21:30:35.247 に答える
0

まだ解決策が見つからないため、前回のCocoaHeads Syracuseミーティングでアドバイスを受け、NSUserDefaultsをサブクラス化する代わりにカテゴリの使用に切り替えることにしました。完璧な解決策ではありませんが、この問題を乗り越えて仕事に戻ることができます。

于 2009-05-08T20:26:28.130 に答える