在我的应用程序中,我做了一个非常简单的绑定。我有一个绑定到NSArrayController的NSMutableArray。控制器本身绑定到ComboBox,它显示NSMutableArray的所有内容。工作正常。
问题是:数组的内容会发生变化。如果用户对应用程序进行了一些调整,我会删除NSMuteableArray中的所有项目,并用新的和不同的项目填充它。
但是NSMutableArray的绑定< - > NSArrayController< - > NSComboBox不刷新。
无论我是否从数组中删除所有对象,ComboBox仍会显示相同的项目。
这里有什么问题?我的方法是错误的还是我只需要告诉绑定刷新自己?我没有发现如何做到这一点。
答案 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消息,以通知绑定,阵列的内容已更改。
基督教