2011-06-18 7 views
11

Mam aplikację, która zasadniczo czyta plik xml i wyświetla wyniki w widoku UITableView. Próbuję zgrupować elementy listy według "kraju" (atrybut elementów pliku xml) i wyświetlić je w sekcjach UITableView.Sekcje grupowania UITableView z NSMutableArray

Obecnie czytam plik xml i przechowuję każdy element jako niestandardowy obiekt w obiekcie NSMutableArray. Matryca ma następującą strukturę:

tablicy: 0 => (nazwa, opis, data, kraj) 1 => (nazwa, opis, data, kraj) 2 => (nazwa, opis data kraj) 3 => (tytuł, opis, data, kraj)

Próbowałem stworzyć inny zestaw unikatowych krajów, który pozwolił mi poprawnie utworzyć nagłówki sekcji, ale staram się wypracować sposób na wyświetlenie poprawne elementy pod nagłówkiem każdej sekcji.

if(![countryArray containsObject:itemCountry]) //if country not already in array 
{ 
    [countryArray addObject:itemCountry]; //Add NSString of country name to array 
} 

Gdzie itemCountry jest atrybutem kraju każdego elementu podczas przechodzenia przez plik xml.

[countryArray count]; //gives me the amount of sections needed 

Zgaduję, że moje pytanie brzmi: jak sprawdzić, ile rzędów musi przejść w każdej sekcji? Jak wyświetlić prawidłowe elementy tablicy dla każdej sekcji?

Każda pomoc lub wskazówki byłoby świetnie

Odpowiedz

21

Zamiast tworzyć tablicę niestandardowych obiektów zawierających dane, należy spojrzeć na tworzenie słownika.

NSMutableDictionary * theDictionary = [NSMutableDictionary dictionary]; 

// Here `customObjects` is an `NSArray` of your custom objects from the XML 
for (CustomObject * object in customObjects) { 
    NSMutableArray * theMutableArray = [theDictionary objectForKey:object.country]; 
    if (theMutableArray == nil) { 
     theMutableArray = [NSMutableArray array]; 
     [theDictionary setObject:theMutableArray forKey:object.country]; 
    } 

    [theMutableArray addObject:object]; 
} 

/* `sortedCountries` is an instance variable */ 
self.sortedCountries = [[theDictionary allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

/* Save `theDictionary` in an instance variable */ 
self.theSource = theDictionary; 

Później numberOfSectionsInTableView:

- (NSInteger)numberOfSectionsInTableView { 
    return [self.sortedCountries count]; 
} 

W tableView:numberOfRowsInSection::

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [[self.theSource objectForKey:[self.sortedCountries objectAtIndex:section]] count]; 
} 

W tableView:cellForRowAtIndexPath::

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    [..] 

    /* Get the CustomObject for the row */ 
    NSString * countryName = [self.sortedCountries objectAtIndex:indexPath.section]; 
    NSArray * objectsForCountry = [self.theSource objectForKey:countryName]; 
    CustomObject * object = [objectsForCountry objectAtIndex:indexPath.row]; 

    /* Make use of the `object` */ 

    [..] 
} 

ta powinna zająć WH ole way.

marginesie
Gdyby nie było przedstawienie danych i po prostu liczbę krajów wtedy lepsza alternatywa dla podejścia PengOne jest użycie NSCountedSet.

NSCountedSet * countedSet = [NSCounted set]; 
for (NSString * countryName in countryNames) { 
    [countedSet addObject:countryName]; 
} 

Teraz wszystkie unikalne kraje są dostępne w [countedSet allObjects] i liczyć na każdy kraj będzie [countedSet countForObject:countryName].

+0

@Michael daj mi znać, jeśli potrzebujesz dalszej pomocy. –

+0

To działało świetnie, dzięki – Leo

+1

Co mam zrobić dla nagłówków sekcji? – Chrizzz

0

Nie należy prawdopodobnie tworzyć wiele tablic, ale utworzyć tablicę słowników. Stwórz więc zmienną tablicę o nazwie counties lub wtv oraz słowniki reklam zawierające tytuł, nazwę itp. Aby utworzyć słownik, wystarczy utworzyć obiekt NSMutableDictionary, a następnie użyć metody setValue:forKey:, aby dodać do niej rzeczy. W przypadku nazwy kraju wartość byłaby nazwą, a klucz - według kraju. Nadzieja, która pomaga.

+0

Podejście sugerowane przez Pete42 byłby jeden użyłbym. W ten sposób możesz użyć KeyValueCoding do sortowania tablic, pobierania grup krajów, itp ... (sprawdź metodę valueForKeyPath: w dokumentach Apple, jest dość potężny). –

3

Dla nagłówków sekcji korzystających odpowiedź Deepak tuż przejść:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    return [self.sortedCountries objectAtIndex:section]; 
} 
Powiązane problemy