0

モデルには Person と Address の 2 つのオブジェクトがあります。Person にはキー名があり、Address との関係は Key Street にあります。

1 つの列 (Person.name) と、名前と通りを含む 2 つのテキスト フィールドを含むテーブルを表示するユーザー インターフェイスを設計しました。

managedObjectContext が設定され、ObjectController が Entity および EntityName Person に設定された NSArrayController を 1 つ作成しました。

アプリを実行すると、テーブルに追加されたすべての人が表示されます。2 つのテキスト フィールドは、Bindings タブを介して Person-ArrayController に接続されます。

値を持つ nameField: Bind To: Person / Controller Key: selected / Model Key Path: name

値を持つ streetField: Bind To: Person / Controller Key: selected / Model Key Path: address.street

名前に何かを書き込むことができ、永続的に保存されます。また、streetField に何かを入力することもできますが、保存されません。

誰もが理由を知っていますか??

4

1 に答える 1

1

配列コントローラーが人物オブジェクトを作成すると、以下のコードのようなことが起こります:
(moc が AppDelegate managedObjectContext であると仮定し、Person が NSManangedObject のサブクラスであると仮定します):

Person *personObj = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:moc]; 
personObj.name = @"something"; //some dummy values
[personObj.address setValue:@"dummy address" forKey:@"street"];

がログに記録されている場合personObj.address、コンソールに nil が出力されます。これは、これまでインスタンス化されていないオブジェクトであるためpersonObj.addressです。AddressしたがってpersonObj.address.streetとなりますNULL。これはあなたの場合にも起こります。

上記のコードを次のように変更すると、正常に動作します。

Person *personObj = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:moc];

//create an Address object and assign it to personObj.address (setting the relationship)
personObj.address= [NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:moc]; 
personObj.name = @"something"; //some dummy values
[personObj.address setValue:@"dummy address" forKey:@"street"]; 

これはバインディングを使用して行うことはできません。

つまり、インスタンス化されたオブジェクトを指していないため、streetFieldバインドされた toaddress.streetは値を取得しません。address

于 2012-08-15T13:28:58.933 に答える