Как я должен удалить все элементы из NSTableView, контролируемого NSArrayController?

StackOverflow https://stackoverflow.com/questions/646787

  •  22-07-2019
  •  | 
  •  

Вопрос

Я использую NSArrayController, NSMutableArray и NSTableView чтобы показать список моих собственных пользовательских объектов (хотя этот вопрос, вероятно, применим, если вы просто показываете список ванильных объектов NSString объекты тоже).

В разные моменты времени мне нужно очистить свой массив и обновить данные из моего источника данных.Однако, просто позвонив removeAllObjects на моем NSMutableArray объект не запускает обновления KVO, поэтому список на экране остается неизменным.

NSArrayController имеет НЕТ removeAllObjects доступный метод, который кажется действительно странным.(У него действительно есть addObject, который я использую для добавления объектов, гарантируя запуск KVO и обновление пользовательского интерфейса.)

Самый чистый способ, которым мне удалось добиться того, чтобы это произошло правильно, - это:

[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];

... итак, мне вроде как приходится самому выполнять уведомление KVO вручную (это находится в моем классе тестового приложения, который содержит myArray свойство, которое является NSMutableArray, как уже упоминалось.)

Это кажется неправильным - есть ли способ получше?Судя по моему гуглению, некоторых людей смущает отсутствие removeAllObjects в NSArrayController, но не видел никаких лучших решений.

Я видел это решение:

[self removeObjectsAtArrangedObjectIndexes:
  [NSIndexSet indexSetWithIndexesInRange:
    NSMakeRange(0, [[self arrangedObjects] count])]];

но мне это кажется еще более неприятным.По крайней мере, мое решение хотя бы отчасти самодокументировано.

Разве Apple не заметила, что иногда люди могут захотеть очистить элемент управления списком, управляемый с помощью NSArrayController возражать?Это кажется довольно очевидным, поэтому я думаю, что, должно быть, я что-то упускаю...

В сторону:конечно, если я добавлю новые элементы в массив (через NSArrayController), затем это запускает обновление KVO с NSArrayController/NSTableView, но:

  1. Иногда я не добавляю никаких элементов в список, потому что их там нет.Таким образом, вы просто видите старые предметы.
  2. В любом случае, это немного противно.
Это было полезно?

Решение

Вы не удаляете элементы из табличного представления. У него нет элементов - он просто отображает элементы другого объекта.

Если вы связали привязку массива содержимого контроллера массива со свойством массива какого-либо другого объекта, вам следует работать с этим свойством этого объекта. Используйте [[object mutableArrayValueForKey: @ " свойство "] removeAllObjects] .

Если, с другой стороны, вы не связали привязку массива содержимого контроллера массива, вам нужно напрямую взаимодействовать с его content . Используйте [[arrayController mutableArrayValueForKey: @ " content "] removeAllObjects] . (Вы также можете работать с ограммойObjects вместо content . Если один не работает, попробуйте другой - я только когда-либо делал вещи первым способом, связывая массив контроллер на что-то другое.)

Другие советы

Если бы эта проблема также была и решена следующим образом:

NSArrayController* persons = /* your array controller */;
[[persons content] removeAllObjects];

Быстрый

@IBOutlet var acLogs: NSArrayController!

acLogs.removeObjects(acLogs.content as! [AnyObject])

сработало на меня.

Решение в Swift:

if let ac = arrayController
{
    let range:NSRange = NSMakeRange(0, ac.arrangedObjects.count);
    let indexSet:NSIndexSet = NSIndexSet(indexesInRange: range);
    ac.removeObjectsAtArrangedObjectIndexes(indexSet);
}

Просто обновление, которое работает в Swift 4:

let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: range))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top