3

在我的应用程序中,我做了一个非常简单的绑定。我有一个绑定到 NSArrayController 的 NSMutableArray。控制器本身绑定到一个 ComboBox 并显示 NSMutableArray 的所有内容。工作正常。

问题是:数组的内容会改变。如果用户对应用程序进行了一些调整,我会删除 NSMuteableArray 中的所有项目并用新的和不同的项目填充它。

但是 NSMutableArray <-> NSArrayController <-> NSComboBox 的绑定不会刷新。

无论我是否从 Array 中删除所有对象,ComboBox 仍然显示相同的项目。

这里有什么问题?我的方法是错误的还是我只需要告诉绑定刷新自己?我不知道该怎么做。

4

3 回答 3

6

您很可能“在控制器背后编辑数组”,这颠覆了 KVO 机制。

你说:

我有一个绑定到 NSArrayController 的 NSMutableArray。

如何?数组在哪里?在文档中,可通过符合 KVC/KVO 的 -myArray / -setMyArray 访问:访问器集?

我敢打赌你是直接告诉“myArray”ivar 到 -removeAllObjects,对吧?这些 KVC/KVO 访问器如何“知道”数组已更改?

答案是,他们没有。如果您真的要替换整个数组,您需要告诉您的文档(或拥有该数组的任何人)到 -setMyArray: 到一个全新的数组。这将触发正确的 KVO 调用。

...但是,你真的不需要一个可变数组,对吗?如果您只想替换数组中的单个项目,则需要使用索引访问器:

(文档 - 请参阅多属性的集合访问器模式部分) http://tinyurl.com/yb2zkr5

于 2009-11-03T16:12:46.700 回答
1

试试这个(使用 ARC/OS X 10.7):

在头文件中,定义arrayInstance和arrayController

 @property (weak) IBOutlet NSArrayController *arrayController;
 @property (strong) NSArray *arrayInstance; // for the array instance

然后在执行中

 @synthesize arrayController = _arrayController;
 @synthesize arrayInstance = _arrayInstance;

 _arrayInstance = .......  // What ever the new array will be
 [_arrayController setContent:_arrayInstance];

这将强制 arrayController 更新内容并正确显示。

另一个但只有 2 行代码的解决方案是:

 [self willChangeValueForKey:@"arrayInstance"];
 _arrayInstance = .......  // What ever the new array will be
 [self didChangeValueForKey:@"arrayInstance"];

认为第一个看起来更明显,第二个更像 KVO。

于 2012-05-22T12:14:35.273 回答
0

KVC/KVO 合规性似乎是问题所在。您应该使用生成的访问器方法创建新数组并使用新对象更新引用。否则,您可能会触发有关正在更新的数组的 KVO 消息,以通知绑定,数组的内容已更改。

基督教

于 2009-11-05T16:33:03.787 回答