NSArrayController:removeAllObjects不刷新TableView
问题描述:
在我的应用程序中,我直接将对象添加到ArrayController。当我想清理所有项目时:NSArrayController:removeAllObjects不刷新TableView
[[downloadItemsController content] removeAllObjects];
但是,该命令不会刷新TableView中的arraycontroller所绑定的内容。如果我删除所有项目并添加其他新项目,我只会看到该项目。这很好,但如果我不添加任何东西,我仍然有我的所有项目在表中。
如果我做
[downloadItemsController prepareContent];
所有老项目从tableview中删除,但比我会得到一个新的空项目我可以编辑。我不希望这样,因为我的一列有一个复选框,我总是会得到一行复选框。
我只需要一个没有项目的空表格,我删除了所有现有的项目。
答
要快速从NSArrayController
对象中删除的所有对象:
NSRange range = NSMakeRange(0, [[anArrayController arrangedObjects] count]);
[anArrayController removeObjectsAtArrangedObjectIndexes:[NSIndexSet indexSetWithIndexesInRange:range]];
的绑定应该自动更新。见original SO answer。
答
调用removeObject..
一组方法对于Core Data对象的集合特别不方便。看起来remove...
适用于那些我们确实需要摆脱数据的情况(例如用户按下'在用户界面删除'按钮),因此NSArrayController
会尝试最好从Core Data DB中删除对象。
我有简单的手动控制NSArrayController
,我发现setContent:
方法很适合添加,删除和替换其中的对象数组。只要清除内容setContents:@[]
即可使用。
答
这为我工作
[anArrayController setContent:nil]
你可以开始填充它的内容就这样
[anArrayController addObject: @{ .... }]
[anArrayController addObject: @{ .... }.mutablecopy]
[anArrayController addObject: aDictionary]
答
有时,当你删除的关键;这里我推迟使用挥发性bool(undoInProgress)在还原动作中,使用上面的解决方案刷新更改数组,观察方法在撤消过程中忽略:
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;
});
}