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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответы [ 5 ]

16 голосов
/ 15 марта 2009

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

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

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

3 голосов
/ 16 августа 2009

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

NSArrayController* persons = /* your array controller */;
[[persons content] removeAllObjects];
1 голос
/ 18 января 2016

Swift

@IBOutlet var acLogs: NSArrayController!

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

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

0 голосов
/ 24 ноября 2018

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

let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: clearRange))
0 голосов
/ 02 мая 2015

Решение в Swift:

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