我正在使用NSArrayController
,NSMutableArray
和NSTableView
显示我自己的自定义对象的列表(尽管如果您仅显示 Vanilla NSString
对象的列表,也可能会遇到此问题)。
在不同的时间点,我需要清除数组并刷新数据源中的数据。但是,仅在removeAllObjects
对象上调用NSMutableArray
不会触发KVO更新,因此屏幕上的列表保持不变。NSArrayController
有没有可用的 removeAllObjects
方法,这似乎很奇怪。 (它确实具有addObject
,我用来添加对象,以确保触发KVO并更新UI。)
我设法导致这种情况正确发生的最干净的方法是:
[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];
...所以我有点不得不自己手动进行KVO通知(这是在我的测试应用程序类中,该类包含
myArray
属性,即NSMutableArray
,如上所述)。这似乎是错误的-有更好的方法吗?从我的谷歌搜索来看,似乎有人对
removeAllObjects
中缺少NSArrayController
感到困惑,但是还没有找到更好的解决方案。我已经看到了以下解决方案:
[self removeObjectsAtArrangedObjectIndexes:
[NSIndexSet indexSetWithIndexesInRange:
NSMakeRange(0, [[self arrangedObjects] count])]];
但这对我来说更令人不快。至少我的解决方案至少是勉强自我记录。
苹果公司是否没有注意到有时人们可能希望清空通过
NSArrayController
对象管理的列表控件?这似乎很明显,所以我想我一定很想念...另外:当然,如果我通过
NSArrayController
将新项目添加到数组中,那么这会触发NSArrayController/NSTableView
的KVO更新,但是:最佳答案
您不会从表格 View 中删除项目。它没有任何项目,仅显示另一个对象的项目。
如果将数组 Controller 的内容数组绑定(bind)绑定(bind)到其他某个对象的数组属性,则应该使用该对象的该属性。使用[[object mutableArrayValueForKey:@"property"] removeAllObjects]
。
另一方面,如果尚未绑定(bind)数组 Controller 的内容数组绑定(bind),则需要直接与其content
进行交互。使用[[arrayController mutableArrayValueForKey:@"content"] removeAllObjects]
。 (您也可以使用arrangedObjects
而不是content
。如果一个不起作用,请尝试另一个-我只做过第一件事,就是将数组 Controller 绑定(bind)到其他东西。)
关于macos - 如何从NSArrayController控制的NSTableView中删除所有项目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/646787/