我应该如何除去所有物品从一个NSTableView控制的NSArrayController?
-
22-07-2019 - |
题
我用一个 NSArrayController
, NSMutableArray
和 NSTableView
来展示我自己定义的目的(虽然这个问题可能是适用的,如果你只是表示一个清单的香草 NSString
象太)。
在不同的时间点,我需要清理我的阵和刷新的数据从我的数据来源。然而,只是打电话 removeAllObjects
我 NSMutableArray
目不会触发的韩国国际志愿者组织的更新,所以该列表在屏幕上仍然保持不变。
NSArrayController
已 没有 removeAllObjects
可用的方法,这似乎很奇怪的。(它不会有 addObject
, 我使用的添加物,以确保韩国国际志愿者组织是触发和更新。)
最清洁的方式我管理,因为这样正确的是:
[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];
...所以我不得不做的韩国国际志愿者组织通知手动自己的(这是在我的测试应用程序类,包含 myArray
财产,这是 NSMutableArray
, 提到的.)
这似乎是错误的-有一个更好的办法?从我在谷歌上搜索它似乎是一个很少有人感到困惑的缺乏 removeAllObjects
在 NSArrayController
, 但没有看到任何更好解决方案。
我已经看到这种解决方案:
[self removeObjectsAtArrangedObjectIndexes:
[NSIndexSet indexSetWithIndexesInRange:
NSMakeRange(0, [[self arrangedObjects] count])]];
但这个看起来甚至更加令人不快给我。至少我的解决方案至少是轻微的自记录。
有没有苹果没有注意到,有时,人们可能希望空的一个列表中控制管理通过一个 NSArrayController
对象?这似乎显而易见的,因此,我认为我必须丢失的东西...
旁白:当然,如果我添加的新项目的阵列(通过 NSArrayController
),那么这触发了韩国国际志愿者组织更新的 NSArrayController/NSTableView
, ,但是:
- 有时候我不会把任何列表中的项目,因为那里没有。所以你看到的只是旧项目。
- 这是一个有点令人讨厌了。
解决方案
你不要删除项目的一个表中查看。它没有任何项目,它只是显示一个目的的项目。
如果你能的阵控制的内容列结合到一系列属性的一些其他目的,那么你应该被工作与该财产的对象。使用 [[object mutableArrayValueForKey:@"property"] removeAllObjects]
.
如果,另一方面,你还没结的阵控制的内容列结合,然后您需要交互其 content
直接。使用 [[arrayController mutableArrayValueForKey:@"content"] removeAllObjects]
.(你也可以工作 arrangedObjects
而不是的 content
.如果不工作,试试其它的—我只做过的事情第一种方式,结合阵控制器到别的东西。)
其他提示
有这个问题以及解决这种方式:
NSArrayController* persons = /* your array controller */;
[[persons content] removeAllObjects];
Swift
@IBOutlet var acLogs: NSArrayController!
acLogs.removeObjects(acLogs.content as! [AnyObject])
为我工作。
解决方案在迅速:
if let ac = arrayController
{
let range:NSRange = NSMakeRange(0, ac.arrangedObjects.count);
let indexSet:NSIndexSet = NSIndexSet(indexesInRange: range);
ac.removeObjectsAtArrangedObjectIndexes(indexSet);
}
只是一个更新工作在迅速4:
let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: range))