2011-06-18 19 views
11

Temel olarak bir xml dosyasını okuyan ve sonuçları bir UITableView'da görüntüleyen bir uygulamam var. Liste öğelerini "ülke" (xml dosya öğelerinin bir özelliği) ile gruplandırmaya ve bunları UITableView Bölümlerinde görüntülemeye çalışıyorum.UITableView NSMutableArray öğesinden bölümler bölümlendirme

Şu anda xml dosyasını okuyor ve her Elementi bir NSMutableArray öğesinde özel bir nesne olarak saklıyorum. Dizi, aşağıdaki yapıya sahiptir:

Dizi: 0 => (başlık, tanım, tarih, ülke) 1 => (başlık, tanım, tarih, ülke) 2 => (başlık, tanım, tarih country) 3 => (başlık, açıklama, tarih, ülke)

Bölüm üstbilgisini doğru şekilde oluşturmama izin veren başka bir benzersiz ülke dizisi oluşturmayı denedim ancak görüntülemenin bir yolunu bulmaya çalışıyorum. her bölüm başlığının altındaki doğru öğeler.

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

ÖğeCountry, xml dosyası aracılığıyla her bir öğenin ülke özniteliğidir.

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

Sanırım sorum, her bölümde kaç satırın gitmesi gerektiği konusunda nasıl çalışırım? Her bölüm için doğru dizi öğelerini nasıl görüntülerim?

Herhangi bir yardım veya işaretçiler Muhtemelen birden diziler oluşturmak ancak sözlükler dizisini oluşturmamalıdır

cevap

21

Verilerinizi içeren bir dizi özel nesne oluşturmak yerine, bir sözlük oluşturmaya da bakmalısınız.

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; 

Daha sonra numberOfSectionsInTableView yılında:

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

tableView:numberOfRowsInSection: yılında:

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

tableView:cellForRowAtIndexPath: yılında:

- (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` */ 

    [..] 
} 

Bu, wh almalı ole yolu. veriyi sunmak ve sadece ülkelerin sayım sonucuna varmak için olmasa

Yan Not
sonra PengOne yaklaşımına için daha iyi bir alternatif bir NSCountedSet kullanmaktır.

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

Şimdi tüm benzersiz ülkeler [countedSet allObjects] mevcuttur ve her ülkenin [countedSet countForObject:countryName] olurdu saymak.sadece git Deepak yanıtını kullanarak bölüm başlıkları için

+0

@Michael, bu konuda daha fazla yardıma ihtiyacınız varsa bildirin. –

+0

Harika çalıştı, teşekkürler – Leo

+1

Bölüm başlıkları için ne yapabilirim? – Chrizzz

0

çok iyi olurdu. Bu yüzden, başlık, isim, vb. Içeren ilçeler veya wtv ve reklam sözlükleri olarak adlandırılabilir bir dizi oluşturun. Bir sözlük oluşturmak oldukça kolaydır, sadece bir NSMutableDictionary nesnesi oluşturun ve daha sonra bir şey eklemek için setValue:forKey: metodunu kullanın. Ülke adı için, değer ülkeye göre isim ve anahtar olurdu. Umarım yardımcı olur.

+0

ben kullanırım biri olacağını Pete42 tarafından önerildiği gibi bir yaklaşım. Bu şekilde, diziyi sıralamak, ülke gruplarını almak vb. Için KeyValueCoding'i kullanabilirsiniz. (Apple'ın dokümanlarındaki valueForKeyPath: yöntemini kontrol edin, oldukça güçlüdür). –

3

:

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