刷新Cocoa绑定-NSArrayController-组合框
在我的应用程序中,我做了一个非常简单的绑定。我有一个绑定到NSArrayController的NSMutableArray。控制器本身绑定到一个组合框,它显示NSMutableArray的所有内容。很好 问题是:数组的内容将更改。如果用户对应用程序进行了一些调整,我将删除NSMuteableArray中的所有项目,并用新的和不同的项目填充它 但是NSMutableArray NSArrayController NSCOMBOX的绑定不刷新 无论我从数组中删除所有对象,组合框仍然显示相同的项 这里怎么了?我的方法是错误的还是我只需要告诉绑定刷新自己?我不知道该怎么做。您可能“在控制器背后编辑阵列”,这会破坏KVO机制 你说: 我有一个绑定到NSArrayController的NSMutableArray 怎么做?阵列在哪里?在文档中,可通过兼容KVC/KVO的-myArray/-setMyArray:访问器集访问 我敢打赌你是直接告诉“myArray”ivar删除所有对象,对吗?这些KVC/KVO访问器如何“知道”阵列已更改 答案是,他们没有。如果您真的要替换整个数组,则需要将您的文档(或数组的所有者)告知-setMyArray:一个全新的数组。这将触发正确的KVO调用 。。。但是,你真的不需要可变数组,是吗?如果只想替换数组中的单个项,则需要使用索引访问器: (文档-请参阅多属性集合访问器模式部分)刷新Cocoa绑定-NSArrayController-组合框,cocoa,cocoa-bindings,nsarraycontroller,Cocoa,Cocoa Bindings,Nsarraycontroller,在我的应用程序中,我做了一个非常简单的绑定。我有一个绑定到NSArrayController的NSMutableArray。控制器本身绑定到一个组合框,它显示NSMutableArray的所有内容。很好 问题是:数组的内容将更改。如果用户对应用程序进行了一些调整,我将删除NSMuteableArray中的所有项目,并用新的和不同的项目填充它 但是NSMutableArray NSArrayController NSCOMBOX的绑定不刷新 无论我从数组中删除所有对象,组合框仍然显示相同的项 这里
KVC/KVO合规性似乎是问题所在。您应该创建新数组,并使用生成的访问器方法用新对象更新引用。否则,您可能会激发有关正在更新的阵列的KVO消息,以通知绑定阵列的内容已更改 Christian试试这个(使用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"];
第一个看起来更明显,第二个更像KVO。我修复了ArrayController和消息对象的出口问题。这样,我在组合框中有了更新的数组。