刷新Cocoa-Binding - NSArrayController - ComboBox

时间:2009-10-26 06:45:54

标签: cocoa cocoa-bindings nsarraycontroller

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

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

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

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

这里有什么问题?我的方法是错误的还是我只需要告诉绑定刷新自己?我没有发现如何做到这一点。

3 个答案:

答案 0 :(得分:6)

你可能“编辑控制器后面的数组”,这颠覆了KVO机制。

你说:

  

我有一个绑定到NSArrayController的NSMutableArray。

如何?阵列在哪里?在一个文档中,可通过符合KVC / KVO的-myArray / -setMyArray访问:访问者集合?

我敢打赌你直接告诉“myArray”ivar -removeAllObjects,对吧?这些KVC / KVO访问器如何“知道”阵列发生了变化?

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

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

(文档 - 请参阅“To-Many Properties的集合访问器模式”部分) http://tinyurl.com/yb2zkr5

答案 1 :(得分: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更新内容并正确显示。

另外两行代码解决方案是:

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

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

答案 2 :(得分:0)

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

基督教