刷新Cocoa绑定-NSArrayController-组合框

刷新Cocoa绑定-NSArrayController-组合框,cocoa,cocoa-bindings,nsarraycontroller,Cocoa,Cocoa Bindings,Nsarraycontroller,在我的应用程序中,我做了一个非常简单的绑定。我有一个绑定到NSArrayController的NSMutableArray。控制器本身绑定到一个组合框,它显示NSMutableArray的所有内容。很好 问题是:数组的内容将更改。如果用户对应用程序进行了一些调整,我将删除NSMuteableArray中的所有项目,并用新的和不同的项目填充它 但是NSMutableArray NSArrayController NSCOMBOX的绑定不刷新 无论我从数组中删除所有对象,组合框仍然显示相同的项 这里

在我的应用程序中,我做了一个非常简单的绑定。我有一个绑定到NSArrayController的NSMutableArray。控制器本身绑定到一个组合框,它显示NSMutableArray的所有内容。很好

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

但是NSMutableArray NSArrayController NSCOMBOX的绑定不刷新

无论我从数组中删除所有对象,组合框仍然显示相同的项

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

您可能“在控制器背后编辑阵列”,这会破坏KVO机制

你说:

我有一个绑定到NSArrayController的NSMutableArray

怎么做?阵列在哪里?在文档中,可通过兼容KVC/KVO的-myArray/-setMyArray:访问器集访问

我敢打赌你是直接告诉“myArray”ivar删除所有对象,对吗?这些KVC/KVO访问器如何“知道”阵列已更改

答案是,他们没有。如果您真的要替换整个数组,则需要将您的文档(或数组的所有者)告知-setMyArray:一个全新的数组。这将触发正确的KVO调用

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

(文档-请参阅多属性集合访问器模式部分)
KVC/KVO合规性似乎是问题所在。您应该创建新数组,并使用生成的访问器方法用新对象更新引用。否则,您可能会激发有关正在更新的阵列的KVO消息,以通知绑定阵列的内容已更改

Christian

试试这个(使用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。

我修复了ArrayController和消息对象的出口问题。这样,我在组合框中有了更新的数组。