在我的应用我做了一个非常简单的绑定。 我有一个绑定到一个NSArrayController的一个的NSMutableArray。 该控制器本身是绑定到一个组合框,它显示了NSMutableArray中的所有内容。 工作良好。
问题是:数组的内容将发生变化。 如果用户做一些调整应用程序,我删除NSMuteableArray的所有项目,并与新的和不同的项目填满它。
但NSMutableArray的结合< - > NSArrayController的< - > NSComboBox不会刷新。
不管我从数组中删除的所有对象的组合框仍显示相同的项目。
这里有什么问题? 是我的方法不对还是我只需要告诉绑定刷新自己? 我没有找到如何做到这一点。
你很可能会“编辑控制器的背后数组”,这颠覆了国际志愿者组织机制。
你说:
我有一个绑定到一个NSArrayController的一个的NSMutableArray。
怎么样? 在什么地方住阵? 在文档中,通过KVC /志愿访问兼容-myArray / -setMyArray:存取的设定?
我敢打赌,你直接告诉“myArray的”伊娃以-removeAllObjects,对不对? 这些KVC /志愿存取将如何“知道”数组有什么改变?
答案是,他们没有。 如果你真的更换整个数组,你要告诉您的文档(或谁拥有数组)-setMyArray:以一个全新的阵列。 这将触发正确的志愿服务。
......但是,你并不真的需要一个可变的数组,你呢? 如果你只是想在阵列中更换不同的物品,你要使用索引存取:
(文档-见一对多属性部分集合访问器模式) http://tinyurl.com/yb2zkr5
尝试这种(使用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"];
认为首先看起来更明显,第二个更志愿样。
KVC / KVO遵守似乎是这个问题。 您应该创建新的数组,并使用所产生的存取方法更新为新对象的引用。 否则可能会触发志愿信息有关阵列正在更新通知绑定,即数组的内容发生了变化。
基督教