7

我正在使用NSArrayController,NSMutableArrayNSTableView显示我自己的自定义对象的列表(尽管如果您也只是显示香草NSString对象的列表,这个问题可能适用)。

在不同的时间点,我需要清除我的数组并刷新我的数据源中的数据。但是,仅调用removeAllObjects我的NSMutableArray对象不会触发 KVO 更新,因此屏幕上的列表保持不变。

NSArrayController没有可用 removeAllObjects方法,这看起来很奇怪。(它确实有addObject,我用它来添加对象,确保触发 KVO 并更新 UI。)

我设法使这种情况正确发生的最干净的方法是:

[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];

...所以我不得不自己手动执行 KVO 通知(这是在我的测试应用程序类中,它包含myArray属性,NSMutableArray如前所述。)

这似乎是错误的 - 有更好的方法吗?从我的谷歌搜索来看,似乎有些人对removeAllObjectsin的缺乏感到困惑NSArrayController,但还没有看到任何更好的解决方案。

我已经看到了这个解决方案:

[self removeObjectsAtArrangedObjectIndexes:
  [NSIndexSet indexSetWithIndexesInRange:
    NSMakeRange(0, [[self arrangedObjects] count])]];

但这对我来说看起来更不愉快。至少我的解决方案至少是少量的自我记录。

Apple 是否没有注意到有时人们可能想要清空通过NSArrayController对象管理的列表控件?这似乎很明显,所以我想我一定错过了一些东西......

另外:当然,如果我向数组中添加新项目(通过NSArrayController),那么这会触发带有 的 KVO 更新NSArrayController/NSTableView,但是:

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

5 回答 5

16

您不会从表格视图中删除项目。它没有任何项目——它只是显示另一个对象的项目。

如果您将数组控制器的内容数组绑定绑定到某个其他对象的数组属性,那么您应该使用该对象的该属性。使用[[object mutableArrayValueForKey:@"property"] removeAllObjects].

另一方面,如果您没有绑定数组控制器的内容数组绑定,那么您需要content直接与其交互。使用[[arrayController mutableArrayValueForKey:@"content"] removeAllObjects]. (您也可以使用arrangedObjects代替content。如果一个不起作用,请尝试另一个 - 我只做过第一种方式,将数组控制器绑定到其他东西。)

于 2009-03-14T23:38:08.043 回答
3

也有这个问题并以这种方式解决:

NSArrayController* persons = /* your array controller */;
[[persons content] removeAllObjects];
于 2009-08-15T20:16:46.663 回答
1

迅速

@IBOutlet var acLogs: NSArrayController!

acLogs.removeObjects(acLogs.content as! [AnyObject])

为我工作。

于 2016-01-17T22:36:44.137 回答
0

Swift 中的解决方案:

if let ac = arrayController
{
    let range:NSRange = NSMakeRange(0, ac.arrangedObjects.count);
    let indexSet:NSIndexSet = NSIndexSet(indexesInRange: range);
    ac.removeObjectsAtArrangedObjectIndexes(indexSet);
}
于 2015-05-02T09:39:00.643 回答
0

只是一个适用于 Swift 4 的更新:

let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: range))
于 2018-11-24T01:05:28.920 回答