当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我应该如何从NSArrayController控制的NSTableView中删除所有项目?》经验,为你挑选了1个好方法。

我正在使用一个NSArrayController,NSMutableArrayNSTableView显示我自己的自定义对象的列表(虽然这个问题可能适用于你只是显示一个香草NSString对象的列表).

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

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

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

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

...所以我有点必须自己手动进行KVO通知(这是在我的测试app类中,包含myArray属性,NSMutableArray如上所述.)

这似乎不对 - 有更好的方法吗?从我的谷歌搜索,似乎有几个人因缺乏的困惑removeAllObjectsNSArrayController,但还没有看到任何更好的解决方案.

我见过这个解决方案:

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

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

Apple没有注意到有时人们可能想要清空通过NSArrayController对象管理的列表控件吗?这看起来很明显,所以我想我一定错过了什么......

除此之外:当然,如果我向数组添加新项目(via NSArrayController),那么这将触发KVO更新NSArrayController/NSTableView,但是:

    有时我不会在列表中放任何项目,因为没有.所以你只看到旧物品.

    无论如何这有点令人讨厌.

Peter Hosey.. 16

您不从表视图中删除项目.它没有任何项目 - 它只显示另一个对象的项目.

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

另一方面,如果您尚未绑定数组控制器的内容数组绑定,则需要content直接与其进行交互.使用[[arrayController mutableArrayValueForKey:@"content"] removeAllObjects].(您也可以使用arrangedObjects而不是content.如果一个不起作用,请尝试另一个 - 我只是第一种方式做事,将数组控制器绑定到别的东西.)



1> Peter Hosey..:

您不从表视图中删除项目.它没有任何项目 - 它只显示另一个对象的项目.

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

另一方面,如果您尚未绑定数组控制器的内容数组绑定,则需要content直接与其进行交互.使用[[arrayController mutableArrayValueForKey:@"content"] removeAllObjects].(您也可以使用arrangedObjects而不是content.如果一个不起作用,请尝试另一个 - 我只是第一种方式做事,将数组控制器绑定到别的东西.)


当ArrayController绑定到数组时,您的方法可以正常工作.但是当ArrayController没有绑定到数组时它不起作用.你从ArrayController得到的`content`数组是一个`NSArray`而不是`NSMutableArray`.只需使用ArrayController中的方法清除内容:`NSRange range = NSMakeRange(0,[[anArrayController arrangeObjects] count]); [anArrayController removeObjectsAtArrangedObjectIndexes:[NSIndexSet indexSetWithIndexesInRange:range]];`
@Quincy```NSRange```解决方案明显快于原始答案或```[anArrayController removeObjects:[anArrayController arrangeObjects]]```.谢谢!
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有