刷新可可绑定 - NSArrayController的 - 组合框(Refresh Cocoa-B

2019-09-01 04:34发布

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

问题是:数组的内容将发生变化。 如果用户做一些调整应用程序,我删除NSMuteableArray的所有项目,并与新的和不同的项目填满它。

但NSMutableArray的结合< - > NSArrayController的< - > NSComboBox不会刷新。

不管我从数组中删除的所有对象的组合框仍显示相同的项目。

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

Answer 1:

你很可能会“编辑控制器的背后数组”,这颠覆了国际志愿者组织机制。

你说:

我有一个绑定到一个NSArrayController的一个的NSMutableArray。

怎么样? 在什么地方住阵? 在文档中,通过KVC /志愿访问兼容-myArray / -setMyArray:存取的设定?

我敢打赌,你直接告诉“myArray的”伊娃以-removeAllObjects,对不对? 这些KVC /志愿存取将如何“知道”数组有什么改变?

答案是,他们没有。 如果你真的更换整个数组,你要告诉您的文档(或谁拥有数组)-setMyArray:以一个全新的阵列。 这将触发正确的志愿服务。

......但是,你并不真的需要一个可变的数组,你呢? 如果你只是想在阵列中更换不同的物品,你要使用索引存取:

(文档-见一对多属性部分集合访问器模式) http://tinyurl.com/yb2zkr5



Answer 2:

尝试这种(使用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"];

认为首先看起来更明显,第二个更志愿样。



Answer 3:

KVC / KVO遵守似乎是这个问题。 您应该创建新的数组,并使用所产生的存取方法更新为新对象的引用。 否则可能会触发志愿信息有关阵列正在更新通知绑定,即数组的内容发生了变化。

基督教



文章来源: Refresh Cocoa-Binding - NSArrayController - ComboBox