2010-08-02 81 views
4

在我的应用程序中,我直接将对象添加到ArrayController。当我想清理所有项目时:NSArrayController:removeAllObjects不刷新TableView

[[downloadItemsController content] removeAllObjects]; 

但是,该命令不会刷新TableView中的arraycontroller所绑定的内容。如果我删除所有项目并添加其他新项目,我只会看到该项目。这很好,但如果我不添加任何东西,我仍然有我的所有项目在表中。

如果我做

[downloadItemsController prepareContent]; 

所有老项目从tableview中删除,但比我会得到一个新的空项目我可以编辑。我不希望这样,因为我的一列有一个复选框,我总是会得到一行复选框。

我只需要一个没有项目的空表格,我删除了所有现有的项目。

回答

1

这是因为您正在修改控制器的内容“背后”。尝试使用阵列控制器的方法-removeObjects:

30

要快速从NSArrayController对象中删除的所有对象:

NSRange range = NSMakeRange(0, [[anArrayController arrangedObjects] count]); 
[anArrayController removeObjectsAtArrangedObjectIndexes:[NSIndexSet indexSetWithIndexesInRange:range]]; 

的绑定应该自动更新。见original SO answer

0

调用removeObject..一组方法对于Core Data对象的集合特别不方便。看起来remove...适用于那些我们确实需要摆脱数据的情况(例如用户按下'在用户界面删除'按钮),因此NSArrayController会尝试最好从Core Data DB中删除对象。

我有简单的手动控制NSArrayController,我发现setContent:方法很适合添加,删除和替换其中的对象数组。只要清除内容setContents:@[]即可使用。

1

这为我工作

[anArrayController setContent:nil] 

你可以开始填充它的内容就这样

[anArrayController addObject: @{ .... }] 
[anArrayController addObject: @{ .... }.mutablecopy] 
[anArrayController addObject: aDictionary] 
0

有时,当你删除的关键;这里我推迟使用挥发性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; 
    }); 
}