5

NSDictionaryオブジェクトをInterface Builderのいくつかのテキストフィールドにバインドするにはどうすればよいですか?NSUserDefaultsでNSDictionaryのオブジェクトをバインドする方法は?

各オブジェクトを辞書の特定の項目にバインドしたいと思います。例えば、最初のテキストフィールドには、俳優にバインドする必要があります。ユーザデフォルトであなたの辞書にそのコントローラーのコンテンツをバインドした後、あなたに.xibファイルをNSDictionaryControllerを追加する

enter image description here

答えて

-1

してみてください。その後、テキストフィールドの値をDictionary Controller(alignedObjectsキー)にバインドすることができます。

私はそれを試したことはありませんが、動作しなければならないと思います。

希望、それは役に立ちます。

+0

これはまさに私が今試みていることです。しかし、NSDictionaryの特定の項目を別のテキストフィールドにバインドする必要があります。だから私はあなたが示唆するように、ControllerKey = "Arranged Objects"の横にModelキーパスを使うべきかどうか疑問に思っていました。ありがとう – aneuryzm

+0

これまで私はこれを試しましたが、うまくいきません。しかし、私は、モデルのキーパスは、NSDictionaryに格納されている項目の名前ではないと思います。 – aneuryzm

4

NSObjectControllerをInterface Builderに追加する必要があります。属性インスペクタタブで標準モード "クラス"を残し、クラス名を "NSMutableDictionary"にしますが、 "コンテンツの準備"をオンにします。バインディングインスペクタで、 "コンテンツオブジェクト"を "共有ユーザデフォルトコントローラ"にバインドし、コントローラのキー "値"と "モデルキーパス"をユーザデフォルトの辞書キーにバインドします。スイッチ "コンテンツを複合値として扱う"をオンにします。

これで、テキストフィールド(またはチェックボックスなど)をバインドできます。コントローラキー "selection"(!)と辞書のキー(モデルキーパス)を使用してObjectControllerに値を渡します。

これが役に立ちます。私はAppleのマニュアルで答えを見つけることができませんでしたが、ネットではなく、別のコントローラオブジェクトを試して自分自身を見つけることがラッキーでした...

+0

ちょうどこれを渦巻きにしました。ユーザーのデフォルトからの値がUIに正しく読み込まれるという意味で機能します。しかし、これらの値が変更されると、それらの変更は期待通りにユーザーのデフォルトに戻されません。どんな考え? – Bryan

+0

それを考え出した。詳しくは下記の答えを加えました。 – Bryan

2

最初:@ keeluuの答えは正しいとマークする必要があります。あなたは、コードではなく、IBを介してこれをやっている場合は

プログラム

それをやって、「落とし穴」のために外を見るためにあります。

 
// Assume 'anObjectController' is an NSObjectController. 
// Assume 'userDefaultsController' is [NSUserDefaultsController sharedUserDefaultsController] 
// Assume 'someDictionary' is an NSDictionary in userDefaults. 

[self.anObjectController 
    bind:NSContentBinding 
    toObject:userDefaultsController 
    withKeyPath:@"values.someDictionary" 
    options:@{NSHandlesContentAsCompoundValueBindingOption: @YES}]; 

あなたが上記の操作を行う場合、あなたは、あなたがsomeDictionaryにプロパティにごUI要素をバインドする際に、これらのUI要素を正しくユーザデフォルト内にある値が表示されますことがわかりますが、次の場合はこのようになりますそれらを変更します(たとえば、バインドされたチェックボックスをクリックすると)、それらの値はユーザーのデフォルトでは更新されません。古い値がくっついています。

理由

結合はNSContentObjectBinding代わりのNSContentBindingにする必要があります。 NSObjectControllerクラスは、contentObjectという名前のバインディングを公開します。バインドすると、すべて正常に動作します。

これはXcodeのコード補完が自動的にNSContentBindingになり、とにかく最も頻繁に使用されるバインディング名の1つなので、間違いありません。これはちょうど私に何時間ものトラブルをもたらしました。

+0

どのように入れ子になった辞書にバインドすることができますか?例えば、これは機能しません:[myButton bind:@ "value" toObject:self。 ObjectController withKeyPath:@ "selection.key1.key2" options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@ "NSContinuouslyUpdatesValue"]; keyPathとして@ "selection.key1"を使用するとうまく動作します。しかし、私は辞書に深くドリルダウンする必要があります。 – gypsyDev

+1

objectControllersのネストされたセットが必要です。各レベルに1つ。 – Bryan

関連する問題