【发布时间】:2010-01-15 03:55:27
【问题描述】:
当调用更新底层数组的方法时,我需要做什么来更新绑定到 NSArrayController 的 tableView?一个例子可以说明这一点。
当我的应用程序启动时,它会创建一个 SubwayTrain。当 SubwayTrain 被初始化时,它会创建一个 SubwayCar。 SubwayCar 有一个可变数组“乘客”。初始化地铁车时,会创建乘客数组,并放入几个 People 对象(假设一个名为“ticket collector”的人和另一个名为“homeless guy”的人)。这些家伙总是在 SubwayCar 上,所以我在初始化时创建它们并将它们添加到乘客数组中。
在应用程序的生命周期内,人们登上汽车。在 SubwayCar 上调用“addPassenger”,并将人作为参数传入。
我有一个绑定到 metroTrain.subwayCar.passengers 的 NSArrayController,并且在启动时我的检票员和无家可归的人表现良好。但是当我使用 [subwayCar addPassenger:] 时,tableView 不会更新。我已经确认乘客肯定已添加到数组中,但 gui 中没有任何更新。
我可能做错了什么?我的直觉是它与 KVO 相关 - 调用 addPassenger 时数组控制器不知道要更新(即使 addPassenger 调用 [passengers addObject:]。我可能会出错 - 如果有帮助,我可以发布代码。
感谢任何愿意提供帮助的人。
更新
所以,事实证明我可以通过改变 addPassenger 方法来实现它
[seatedPlayers addObject:person];
到
NSMutableSet *newSeatedPlayers = [NSMutableSet setWithSet:seatedPlayers];
[newSeatedPlayers addObject:sp];
[seatedPlayers release];
[self setSeatedPlayers:newSeatedPlayers];
我猜这是因为我正在使用 [self setSeatedPlayers]。这是正确的方法吗?复制数组、释放旧数组并更新副本(而不是仅仅添加到现有数组)似乎非常麻烦。
【问题讨论】:
-
表格视图如何绑定到控制器上?您是否将每个表列绑定到
subwayTrain.subwayCar.passengers的属性(例如,列名称绑定到subwayTrain.subwayCar.passengers.name)? -
没错。乘客姓名会在它启动时显示。
标签: cocoa cocoa-bindings key-value-observing nsarraycontroller