Я использую 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
, но:
- Иногда я не помещаю какие-либо элементы в список, потому что их нет. Итак, вы просто видите старые предметы.
- В любом случае, это немного противно.