我正在使用NSArrayControllerNSMutableArrayNSTableView显示我自己的自定义对象的列表(尽管如果您仅显示 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/

    10-12 21:28