在我的应用程序中,我将对象直接添加到ArrayController。当我想清理我做的所有物品时:
[[downloadItemsController content] removeAllObjects];
但是,此命令不会刷新arraycontroller绑定的TableView。如果我删除所有项目并添加另一个新项目,我只会看到该项目。这很好,但如果我不添加任何东西,我仍然将所有项目都放在表格中。
如果我这样做
[downloadItemsController prepareContent];
从tableview中删除所有旧项目,但是我将获得一个我可以编辑的新的空项目。我不希望这样,因为我的一个列有一个复选框,我总是得到一个带复选框的行。
删除所有现有项目后,我只需要一个没有项目的空表。
答案 0 :(得分:31)
快速删除NSArrayController
对象中的所有对象:
NSRange range = NSMakeRange(0, [[anArrayController arrangedObjects] count]);
[anArrayController removeObjectsAtArrangedObjectIndexes:[NSIndexSet indexSetWithIndexesInRange:range]];
绑定应自动更新。请参阅original SO answer。
答案 1 :(得分:3)
这对我有用
[anArrayController setContent:nil]
您可以像这样立即开始填充其内容
[anArrayController addObject: @{ .... }]
[anArrayController addObject: @{ .... }.mutablecopy]
[anArrayController addObject: aDictionary]
答案 2 :(得分:2)
这是因为你正在“背后”修改控制器的内容。尝试使用阵列控制器的-removeObjects:方法。
答案 3 :(得分:0)
调用removeObject..
方法组对于Core Data对象的集合特别不方便。似乎remove...
适用于那些我们真正需要删除数据的情况(例如用户在UI上按'删除'按钮时),因此NSArrayController
我们也会尝试从Core Data DB中删除对象。
我对NSArrayController
进行了简单的手动控制,我发现setContent:
方法非常适合添加,删除和替换其中的对象数组。只需清除内容setContents:@[]
即可。
答案 4 :(得分:0)
有时当你删除是关键;在这里,我推迟在恢复操作中使用volatile bool(undoInProgress),使用上面的解决方案来刷新一个更改数组,当undo正在进行时,观察方法会忽略:
volatile bool undoInProgress = 0;
- (IBAction)revert:(id)sender
{
NSUserDefaults * prefs = [NSUserDefaults standardUserDefaults];
NSArray * undo = [NSArray arrayWithArray:changes];
undoInProgress = YES;
// We have a single key/value pair but do so in reverse order
for (NSInteger i=[undo count]-1; i>=0; --i)
{
NSDictionary * change = [undo objectAtIndex:i];
NSString * key = [change objectForKey:@"keyPath"];
id val = [change objectForKey:NSKeyValueChangeOldKey];
[prefs setValue:val forKey:key];
}
dispatch_async(dispatch_get_main_queue(), ^{
NSRange range = NSMakeRange(0, [[changeController arrangedObjects] count]);
[changeController removeObjectsAtArrangedObjectIndexes:[NSIndexSet indexSetWithIndexesInRange:range]];
undoInProgress = NO;
});
}