将数组控制器绑定到'派生'属性 - KVO问题?

时间:2010-02-21 23:33:45

标签: cocoa cocoa-bindings nsarraycontroller

抱歉笨拙的头衔。

想象一个简单的用户界面来显示一个人孩子的名字......

由于我最初只有一个Person,我创建了一个数组控制器并将其绑定到appDelegate.person1.children - 这样工作正常,绑定表列以显示名字。

但是,我已经扩展了我的程序,以便在AppDelegate中维护一个数组或人员而不是'person1'。我想我可以简单地保留person1属性,然后用它来返回列表中的第一项:

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

我已确认所有内容都已正确创建(在运行时),但我无法获取绑定表列以显示person1的孩子的名字。

与KVO有什么关系?如何确保表知道人员数组更改时,person1更改(因此UI)?

由于

2 个答案:

答案 0 :(得分:1)

@“我如何确保表格知道人员阵列发生变化时,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"];

答案 1 :(得分:1)

  

如何确保表格知道人员数组发生变化时,person1会更改(以及UI)?

您的意思是person1属性的值依赖persons属性的值。那么,前者就是所谓的dependent key

因此,请实施keyPathsForValuesAffectingPerson1以返回包含@"persons"

的集合

您还需要以可观察的方式更改属性的值。直接与阵列交谈不会削减它;什么都不知道价值已经改变。正如Raj Pawan已经指出的那样,一种方法是自己明确发送全价值意愿/做出改变的通知。

另一种方法,我发现更容易阅读和编写,是为数组属性(在您的情况下,persons属性)实现array accessor methods,并专门使用这些访问器来改变数组(在initdealloc之外)。当您拨打访问者时,KVO通知是免费的。这应该包括任何依赖键。