刷新Cocoa绑定 - NSArrayController - ComboBox

3
在我的应用程序中,我创建了一个非常简单的绑定。我有一个NSMutableArray绑定到NSArrayController。控制器本身绑定到ComboBox并显示NSMutableArray的所有内容。工作得很好。
问题是:数组的内容将会改变。如果用户对应用程序进行了一些调整,我会删除NSMuteableArray中的所有项目,并用新的和不同的项目填充它。
但是NSMutableArray <-> NSArrayController <-> NSComboBox的绑定不会刷新。
无论我从数组中删除所有对象,ComboBox仍然显示相同的项目。
这里错在哪里?我的方法错了还是我只需要告诉绑定刷新自己?我没有找到如何做到这一点。
3个回答

6
您可能是“在控制器背后编辑数组”,这会破坏KVO机制。
您说:
我有一个NSMutableArray绑定到一个NSArrayController。
如何实现?数组在哪里?在文档中,可以通过KVC/KVO兼容的-myArray / -setMyArray:访问器组来访问?
我敢打赌你直接告诉“myArray” ivar去- removeAllObjects,对吗?这些KVC/KVO访问器如何“知道”数组已更改?
答案是它们不知道。如果您确实要替换整个数组,则需要告诉您的文档(或拥有该数组的人)- setMyArray:为全新的数组。这将触发正确的KVO调用。
但是,您真的不需要可变数组,对吗?如果您只想替换数组中的单个项目,则需要使用索引访问器:
(文档-请参见“ To-Many Properties部分的Collection Accessor Patterns”) http://tinyurl.com/yb2zkr5

3
我使用ArrayController中的Outlet和rearrangeObjects消息解决了问题。这样,我就可以在组合框中使用更新后的数组了。 - TalkingCode

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。


0

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

Christian


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接