我正在使用NSArrayController
,NSMutableArray
和NSTableView
来显示我自己的自定义对象列表(尽管如果您只显示一个香草列表,这个问题可能适用NSString
也是对象。
在不同的时间点,我需要清除我的数组并刷新数据源中的数据。但是,仅在我的removeAllObjects
对象上调用NSMutableArray
不会触发KVO更新,因此屏幕上的列表保持不变。
NSArrayController
有没有 removeAllObjects
方法,这看起来很奇怪。 (它确实有addObject
,我用它来添加对象,确保触发KVO并更新UI。)
我设法造成这种情况的最简单方法是:
[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];
...所以我需要自己手动执行KVO通知(这是在我的测试应用类中,它包含myArray
属性,如{1}}所述。 )
这似乎不对 - 有更好的方法吗?从我的谷歌搜索看来,似乎有些人对NSMutableArray
中缺少removeAllObjects
感到困惑,但没有看到任何更好的解决方案。
我见过这个解决方案:
NSArrayController
但这对我来说更加不愉快。至少我的解决方案至少是自我记录。
Apple有没有注意到有时人们可能想清空通过[self removeObjectsAtArrangedObjectIndexes:
[NSIndexSet indexSetWithIndexesInRange:
NSMakeRange(0, [[self arrangedObjects] count])]];
对象管理的列表控件?这看起来很明显,所以我想我一定错过了什么......
除此之外:当然,如果我向数组添加新项目(通过NSArrayController
),则会触发NSArrayController
的KVO更新,但是:
答案 0 :(得分:16)
您不会从表格视图中删除项目。它没有任何项目 - 它只显示另一个对象的项目。
如果将数组控制器的内容数组绑定绑定到某个其他对象的数组属性,那么您应该使用该对象的该属性。使用[[object mutableArrayValueForKey:@"property"] removeAllObjects]
。
另一方面,如果您尚未绑定数组控制器的内容数组绑定,则需要直接与其content
进行交互。使用[[arrayController mutableArrayValueForKey:@"content"] removeAllObjects]
。 (您也可以使用arrangedObjects
而不是content
。如果一个不起作用,请尝试另一个 - 我只是第一种方式做事,将数组控制器绑定到别的东西。)
答案 1 :(得分:3)
也有这个问题并以这种方式解决了:
NSArrayController* persons = /* your array controller */;
[[persons content] removeAllObjects];
答案 2 :(得分:1)
夫特
@IBOutlet var acLogs: NSArrayController!
acLogs.removeObjects(acLogs.content as! [AnyObject])
为我工作。
答案 3 :(得分:0)
Swift中的解决方案:
if let ac = arrayController
{
let range:NSRange = NSMakeRange(0, ac.arrangedObjects.count);
let indexSet:NSIndexSet = NSIndexSet(indexesInRange: range);
ac.removeObjectsAtArrangedObjectIndexes(indexSet);
}
答案 4 :(得分:0)
只是一个可以在Swift 4中运行的更新:
let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: clearRange))