Używam NSArrayController
, i , aby wyświetlić listę własnych obiektów niestandardowych (chociaż to pytanie prawdopodobnie ma zastosowanie, jeśli wyświetlasz tylko listę obiektów z wanilią NSString
).Jak usunąć wszystkie elementy z NSTableView kontrolowane przez NSArrayController?
W różnych momentach, potrzebuję wyczyścić moją tablicę i odświeżyć dane z mojego źródła danych. Jednak po prostu wywołanie removeAllObjects
na moim obiekcie NSMutableArray
nie powoduje aktualizacji KVO, więc lista na ekranie pozostaje niezmieniona.
NSArrayController
ma noremoveAllObjects
dostępna metoda, co wydaje się naprawdę dziwne. (To ma addObject
, które używam, aby dodać obiekty, zapewniając KVO jest wyzwalany i interfejs użytkownika jest aktualizowany.)
najczystszy sposób udało mi się spowodować to zdarzyć właściwie jest:
[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];
... więc mam niby zrobić konieczności powiadomienia KVO ręcznie siebie (jest to w mojej klasie aplikacji testowej, która zawiera właściwość myArray
, który jest NSMutableArray
, jak wspomniano).
wydaje się źle - jest istnieje lepszy sposób? Z mojego googlowania wynika, że kilka osób jest zdezorientowanych brakiem removeAllObjects
w NSArrayController
, ale nie widziałem żadnych lepszych rozwiązań.
Widziałem tego rozwiązania:
[self removeObjectsAtArrangedObjectIndexes:
[NSIndexSet indexSetWithIndexesInRange:
NSMakeRange(0, [[self arrangedObjects] count])]];
ale wygląda to jeszcze bardziej nieprzyjemne dla mnie. Przynajmniej moje rozwiązanie jest co najmniej marginalnie samo-dokumentujące.
Czy Apple nie zauważyło, że czasami ludzie mogą chcieć opróżnić kontrolkę listy zarządzaną przez obiekt NSArrayController
? To wydaje się oczywiste, więc myślę, że muszę czegoś przegapić ...
Pomijając: oczywiście, jeśli dodam nowe elementy do tablicy (przez NSArrayController
), to wyzwala aktualizację KVO z NSArrayController/NSTableView
, ale :
- Czasami nie umieszczam żadnych pozycji na liście, ponieważ ich nie ma. Widzisz tylko stare przedmioty.
- W każdym razie to trochę brzydko.
Dzięki - to działa. Zmieniłem swój oryginalny kod w moim pytaniu na: [[self mutableArrayValueForKey: @ "myArray"] removeAllObjects]; i działa dobrze. Znacznie czystsze. Zapisałeś mutableArrayValueForKey w niewłaściwym miejscu - napraw to i zaznaczę to jako zaakceptowaną odpowiedź. :-) – Slacker
Twoja metoda działa idealnie, gdy ArrayController jest ograniczony do tablicy. Ale nie działa, gdy ArrayController nie jest ograniczony do tablicy. Tablica 'content' pobierana z ArrayController jest' NSArray', a nie 'NSMutableArray'. Po prostu użyj metody z ArrayController, aby wyczyścić zawartość: 'NSRange range = NSMakeRange (0, [[anArrayController arrangedObjects] count]); [anArrayController removeObjectsAtArrangedObjectIndexes: [NSIndexSet indexSetWithIndexesInRange: range]];' – Quincy
@Quincy '' 'NSRange'' 'rozwiązanie jest znacznie szybsze niż oryginalna odpowiedź lub' '' [anArrayController removeObjects: [anArrayController arrangedObjects]] '' '. Dzięki! – bdunagan