NSArrayController: removeAllObjects не обновляет TableView

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

[[downloadItemsController content] removeAllObjects];

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

If I do

[downloadItemsController prepareContent];

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

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


person TalkingCode    schedule 02.08.2010    source источник


Ответы (5)


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

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

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

person bdunagan    schedule 23.11.2011

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

person Joshua Nozzi    schedule 03.08.2010

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

[anArrayController setContent:nil]

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

[anArrayController addObject: @{ .... }]
[anArrayController addObject: @{ .... }.mutablecopy]
[anArrayController addObject: aDictionary]
person rraallvv    schedule 24.03.2015

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

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

person zubko    schedule 22.02.2014
comment
Но, в отличие от ответа @rraalvv, вы не можете сразу начать заполнять его содержимое. Вы получите сообщение об ошибке Неопознанный селектор отправлен экземпляру... - person Muntashir Akon; 12.01.2019

Иногда при удалении находится ключ; здесь я откладываю использование 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;
    });
}
person slashlos    schedule 27.03.2017