2

对不起笨拙的标题。

想象一个简单的 UI 来显示一个人孩子的名字......

因为我最初只有一个人,所以我创建了一个数组控制器并将其绑定到 appDelegate.person1.children - 这很好,绑定表列以显示名字也是如此。

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

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

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

与KVO有关吗?我如何确保表格知道当 people 数组更改时, person1 会更改(因此 UI 也会更改)?

谢谢

4

2 回答 2

1

@“我如何确保表格知道当 person 数组更改时, 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

我如何确保表格知道当 people 数组更改时, person1 会更改(因此 UI 也会更改)?

您的意思是person1财产的价值取决于财产的价值persons。那么,前者就是所谓的依赖键

因此,实现keyPathsForValuesAffectingPerson1返回一个包含@"persons".

您还需要以可观察的方式更改属性的值。直接与数组对话不会削减它;没有人会知道价值已经改变。正如 Raj Pawan 已经指出的那样,一种方法是自己显式发送全值 value-will/did-change 通知。

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

于 2010-02-22T14:57:41.193 回答