抱歉笨拙的头衔。
想象一个简单的用户界面来显示一个人孩子的名字......
由于我最初只有一个Person,我创建了一个数组控制器并将其绑定到appDelegate.person1.children - 这样工作正常,绑定表列以显示名字。
但是,我已经扩展了我的程序,以便在AppDelegate中维护一个数组或人员而不是'person1'。我想我可以简单地保留person1属性,然后用它来返回列表中的第一项:
- (Person *)person1{
return [[self people] objectAtIndex:0];
}
我已确认所有内容都已正确创建(在运行时),但我无法获取绑定表列以显示person1的孩子的名字。
与KVO有什么关系?如何确保表知道人员数组更改时,person1更改(因此UI)?
由于
答案 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,并专门使用这些访问器来改变数组(在init
和dealloc
之外)。当您拨打访问者时,KVO通知是免费的。这应该包括任何依赖键。