2

くだらないタイトルでごめんなさい。

人の子供の名前を表示するシンプルな UI を想像してみてください...

最初は Person が 1 つしかなかったので、配列コントローラーを作成して appDelegate.person1.children にバインドしました。これはうまく機能し、名前を表示するためにテーブル列をバインドしました。

ただし、「person1」ではなく、AppDelegate で維持される配列または人が存在するように、プログラムを拡張しました。ただし、 person1 属性を保持し、それを使用してリストの最初の項目を返すことができると考えました。

- (Person *)person1{
    return [[self people] objectAtIndex:0];
}

すべてが (実行時に)正しく作成されていることを確認しましたが、バインドされたテーブル列に person1 の子供の名を表示することができません。

KVOと何か?人の配列が変更されたときに person1 (したがって UI) が変更されることをテーブルが認識していることを確認するにはどうすればよいですか?

ありがとう

4

2 に答える 2

1

@ "persons配列が変更されると、person1(したがってUI)が変更されることをテーブルが認識していることを確認するにはどうすればよいですか?"

子配列を変更する場合は、必ずその間に行うようにしてください。

    - (void)willChangeValueForKey:(NSString *)key
    - (void)didChangeValueForKey:(NSString *)key

バインドされたオブジェクトの。

好き:

[self willChangeValueForKey:@"children"];
[[self children] addObject: <some_new_child_object>]; // Add new child object to self.children
[self didChangeValueForKey:@"children"];
于 2010-02-22T07:01:34.910 に答える
1

人の配列が変更されたときに person1 (したがって UI) が変更されることをテーブルが認識していることを確認するにはどうすればよいですか?

person1プロパティの値は、プロパティの値に依存していることを意味しpersonsます。前者は、従属キーと呼ばれるものです。

したがって、keyPathsForValuesAffectingPerson1を含むセットを返すように実装し@"persons"ます。

また、監視可能な方法でプロパティの値を変更する必要があります。配列に直接話しかけてもうまくいきません。値が変更されたことは何もわかりません。Raj Pawan が既に述べたように、1 つの方法は、値全体の value-will/did-change 通知を自分で明示的に送信することです。

読み書きがはるかに簡単なもう1つの方法は、配列プロパティ(あなたの場合はプロパティ)の配列アクセサーメソッドpersonsを実装し、これらのアクセサーを排他的に使用して配列を変更することです(initandの外側dealloc)。アクセサーを呼び出すと、KVO 通知が無料で発生します。これには、依存するキーも含める必要があります。

于 2010-02-22T14:57:41.193 に答える