NSArrayController:removeAllObjects不刷新TableView

时间:2010-08-02 20:53:45

标签: objective-c cocoa nsarraycontroller

在我的应用程序中,我将对象直接添加到ArrayController。当我想清理我做的所有物品时:

[[downloadItemsController content] removeAllObjects];

但是,此命令不会刷新arraycontroller绑定的TableView。如果我删除所有项目并添加另一个新项目,我只会看到该项目。这很好,但如果我不添加任何东西,我仍然将所有项目都放在表格中。

如果我这样做

[downloadItemsController prepareContent];

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

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

5 个答案:

答案 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;
    });
}