NSArrayController: removeAllObjects не обновляет TableView - PullRequest
5 голосов
/ 03 августа 2010

В моем приложении я добавляю объекты непосредственно в ArrayController. Когда я хочу убрать все вещи, которые я делаю:

[[downloadItemsController content] removeAllObjects];

Эта команда, однако, не обновляет TableView, с которым связан контроллер массива. Если я удаляю все элементы и добавляю новые, я вижу только этот элемент. Это нормально, но если я ничего не добавлю, у меня останутся все мои предметы в таблице.

Если я делаю

[downloadItemsController prepareContent];

все старые элементы удаляются из таблицы, но затем я получаю новый и пустой элемент, который я могу редактировать. Я не хочу этого, и поскольку в одном из моих столбцов есть флажок, я всегда получаю строку с флажком.

Мне просто нужна пустая таблица без элементов после удаления всех существующих элементов.

Ответы [ 5 ]

32 голосов
/ 23 ноября 2011

Чтобы быстро удалить все объекты из объекта NSArrayController:

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

Привязки должны обновляться автоматически.См. оригинальный ответ SO .

3 голосов
/ 24 марта 2015

Это сработало для меня

[anArrayController setContent:nil]

Вы можете начать заполнять его содержимое сразу, как это

[anArrayController addObject: @{ .... }]
[anArrayController addObject: @{ .... }.mutablecopy]
[anArrayController addObject: aDictionary]
2 голосов
/ 03 августа 2010

Это потому, что вы изменяете содержимое контроллера «за его спиной».Попробуйте использовать метод -removeObjects: контроллера массива.

0 голосов
/ 27 марта 2017

Иногда при удалении стоит ключ; здесь я отложил использование 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;
    });
}
0 голосов
/ 22 февраля 2014

Вызов removeObject.. группы методов особенно неудобен для коллекции объектов Core Data.Кажется, что remove... предназначено для тех случаев, когда нам действительно нужно избавиться от данных (например, когда пользователь нажимает кнопку «Удалить» в пользовательском интерфейсе), поэтому NSArrayController будет стараться изо всех силУдалите объекты из базы данных Core Data.

У меня есть простое ручное управление NSArrayController, и я обнаружил, что метод setContent: отлично подходит для добавления, удаления и замены массива объектов внутри него.И только для очистки содержимого setContents:@[] можно использовать.

...