我应该如何从NSArrayController控制的NSTableView中删除所有项目?

时间:2009-03-14 21:39:07

标签: macos cocoa nsarraycontroller

我正在使用NSArrayControllerNSMutableArrayNSTableView来显示我自己的自定义对象列表(尽管如果您只显示一个香草列表,这个问题可能适用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更新,但是:

  1. 有时我不会在列表中放任何项目,因为没有。所以你只看到旧物品。
  2. 无论如何,这有点令人讨厌。

5 个答案:

答案 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))