5

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

[[downloadItemsController content] removeAllObjects];

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

如果我做

[downloadItemsController prepareContent];

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

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

4

5 回答 5

32

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

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

绑定应自动更新。请参阅原始 SO 答案

于 2011-11-23T12:30:43.333 回答
3

这对我有用

[anArrayController setContent:nil]

您可以像这样立即开始填充其内容

[anArrayController addObject: @{ .... }]
[anArrayController addObject: @{ .... }.mutablecopy]
[anArrayController addObject: aDictionary]
于 2015-03-24T02:14:41.833 回答
3

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

于 2010-08-03T13:43:01.393 回答
0

对于 Core Data 对象的集合,调用removeObject..方法组特别不方便。似乎这remove...适用于我们确实需要删除数据的情况(例如当用户在 UI 上按下“删除”NSArrayController按钮时),因此最好也从 Core Data DB 中删除对象。

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

于 2014-02-22T09:40:01.063 回答
0

有时当你删除是关键;在这里,我推迟在恢复操作中使用 volatile 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;
    });
}
于 2017-03-27T17:56:15.620 回答