2014-10-21 12 views
6

Ottengo alcuni dati da un file xml sul web usando l'holly. Nel mio file xml ho un sacco di sezioni diverse da cui ottengo i dati (circa 20).UITableView - imposta tableview con dati Hpple

Heres il codice che sto usando per ottenere i dati

- (void)getMenuItems:(NSString*)url{ 

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
    //NSLog(@"response == %@", response); 

    [self getDeli:data]; 
} 

- (void)getDeli:(NSData*)deliData { 
TFHpple *Parser = [TFHpple hppleWithHTMLData:deliData]; 
// 3 
NSString *XpathQueryString = self.deliString; 

NSArray *Nodes = [Parser searchWithXPathQuery:XpathQueryString]; 

// 4 
NSMutableArray *newNodes = [[NSMutableArray alloc] initWithCapacity:0]; 
for (TFHppleElement *element in Nodes) { 
    // 5 
    Items *item = [[Items alloc] init]; 
    [newNodes addObject:item]; 

    // 6 
    item.title = [[element firstChild] content]; 
    item.title = [[[element firstChild] content]stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 


    // 7 
    item.url = [element objectForKey:@"href"]; 
} 

// 8 
_deli = newNodes; 
[self.tableView reloadData]; 

}

Il codice tutte le opere, e io ottenere i dati del problema è che non tutte le sezioni hanno tutti i dati, e l'impostazione i titoli delle sezioni e l'impostazione dei dati in CellForRowAtIndexPath sono una seccatura mentre lo cambio depeing su ciò che viene restituito e lo stesso con il numero di sezioni.

Quindi, sto cercando di scoprire quante sezioni vengono restituite come e impostarle sul numero di sezioni in tableview e quindi impostare le intestazioni di sezione sul titolo nelle intestazioni della sezione del file xml e così via.

In modo che non sia sufficiente impostare l'intestazione e l'altezza della riga su 0 se la sezione o la cella è vuota.

Spero che abbia un senso ...

Ecco la maggior parte dei file XML

<day name="monday"> 
<meal name="DINNER"> 
<counter name="Chefs Choice"> 
<dish> 
<name>Vegetable Samosa with Yogurt Sauce</name> 
</dish> 
<dish> 
<name>Tomato Red Pepper Chutney</name> 
</dish> 
<dish> 
<name>Curried Rice & Lentils</name> 
</dish> 
</counter> 
<counter name="Entrée"> 
<dish> 
<name>London Broil</name> 
</dish> 
<dish> 
<name>Oven Roast Rosemary Red Potatoes</name> 
</dish> 
<dish> 
<name>Glazed Fresh Carrots</name> 
</dish> 
<dish> 
<name>Salad Bar</name> 
</dish> 
<dish> 
<name>Cheddar Cheese & Bacon Potato Salad</name> 
</dish> 
</counter> 
<counter name="Grill"> 
<dish> 
<name>Hamburger</name> 
</dish> 
<dish> 
<name>Classic Cheeseburger on a Toasted Bun</name> 
</dish> 
<dish> 
<name>Chicken Sandwich</name> 
</dish> 
<dish> 
<name>French Fries</name> 
</dish> 
</counter> 
<counter name="International"> 
<dish> 
<name>Shell Pasta</name> 
</dish> 
<dish> 
<name>Spaghetti Sauce with Tomato Bits</name> 
</dish> 
<dish> 
<name>Alfredo Sauce</name> 
</dish> 
</counter> 
<counter name="Pizza"> 
<dish> 
<name>Cheese Pizza</name> 
</dish> 
<dish> 
<name>Pepperoni Pizza</name> 
</dish> 
<dish> 
<name>Antipasto Pizza Slice</name> 
</dish> 
</counter> 
<counter name="Soup"> 
<dish> 
<name>Tomato Soup Florentine</name> 
</dish> 
</counter> 
<counter name="Vegetable"> 
<dish> 
<name>Eggplant Parmesan Casserole</name> 
</dish> 
</counter> 
</meal> 
</day> 

Grazie per l'aiuto in anticipo

+0

E 'difficile dire dal codice che hai postato, ma sembra che tu stia semplicemente memorizzando tutto in un array. Probabilmente è necessario creare una classe di modelli di dati più sofisticata e analizzare i dati in questo, ad esempio un dizionario che contiene una matrice per ogni sezione. La chiave sarebbe il nome della sezione e quindi è possibile escludere le sezioni in cui il numero di array è 0 – Paulw11

+0

@ Paulw11 ya che suona secondo le linee di quello che stavo pensando non so esattamente da dove cominciare –

+0

Qual è il tuo XPathQueryString o deliString? vale a dire. quali nodi stai elaborando nel ciclo for? – Paulw11

risposta

2

È necessario analizzare la struttura di XML in un dati appropriato oggetto del modello in modo da poter accedere ai dati tramite una gerarchia.

Questa è una classe modello di dati che potrebbe funzionare -

metodo
#import <Foundation/Foundation.h> 


typedef NS_ENUM(NSInteger, DeliDay) { 
    DeliDayMonday=0, 
    DeliDayTuesday=1, 
    DeliDayWednesday=2, 
    DeliDayThursday=3, 
    DeliDayFriday=4, 
    DeliDaySaturday=5, 
    DeliDaySunday=6, 
    DeliDayUnknown=-1 
}; 


@interface DeliData : NSObject 


@property (strong,nonatomic,readonly) NSArray *days; 
@property (strong,nonatomic,readonly) NSArray *meals; 
@property (strong,nonatomic,readonly) NSArray *counters; 


-(id)init:(NSData *)menuData; 

-(NSArray *) itemsForMeal:(NSString *)meal onDay:(DeliDay)day atCounter:(NSString *)counter ; 
-(NSArray *) mealsForDay:(DeliDay)day; 
-(NSArray *) countersForMeal:(NSString *)meal onDay:(DeliDay)day; 

+(DeliDay)deliDayForString:(NSString *)dayString; 
+(NSString *)stringForDeliDay:(DeliDay)day; 

@end 

La parse ha bisogno di lavorare attraverso i tag e costruire le strutture di dati -

-(void)parseXML:(NSData *)menuData { 
    TFHpple *Parser = [TFHpple hppleWithXMLData:menuData]; 
    NSString *XpathQueryString = @"//day"; 

    NSArray *Nodes = [Parser searchWithXPathQuery:XpathQueryString]; 

    for (TFHppleElement *element in Nodes) { 

     NSString *dayString=element.attributes[@"name"]; 

     DeliDay day=[DeliData deliDayForString:dayString]; 

     if (day != DeliDayUnknown) { 
      NSMutableDictionary *dayDict=(NSMutableDictionary *)self.menuData[day]; 
      NSArray *mealsArray=[element childrenWithTagName:@"meal"]; 
      for (TFHppleElement *mealElement in mealsArray) { 
       NSString *mealName=mealElement.attributes[@"name"]; 
       NSMutableDictionary *counterDict=(NSMutableDictionary *)dayDict[mealName]; 
       if (counterDict == nil) { 
        counterDict=[NSMutableDictionary new]; 
        dayDict[mealName]=counterDict; 
       } 
       NSArray *countersArray=[mealElement childrenWithTagName:@"counter"]; 
       for (TFHppleElement *counterElement in countersArray) { 
        NSString *counterName=counterElement.attributes[@"name"]; 
        NSMutableArray *itemsArray=(NSMutableArray *)counterDict[counterName]; 
        if (itemsArray == nil) { 
         itemsArray=[NSMutableArray new]; 
         counterDict[counterName]=itemsArray; 
        } 
        NSArray *dishArray=[counterElement childrenWithTagName:@"dish"]; 
        for (TFHppleElement *dishElement in dishArray) { 
         Item *newItem=[Item new]; 
         TFHppleElement *dishNameElement=[dishElement firstChildWithTagName:@"name"]; 
         NSString *text=[[dishNameElement firstTextChild].content stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 
         newItem.title=text; 
         TFHppleElement *dishUrlElement=[dishElement firstChildWithTagName:@"url"]; 
         text=[[dishUrlElement firstTextChild].content stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 
         newItem.url=text; 
         [itemsArray addObject:newItem]; 
        } 
       } 
      } 
     } 
     else { 
      NSLog(@"Invalid day name %@",dayString); 
     } 
    } 

} 

Il metodo init è -

-(id)init:(NSData *)menuData { 
    if (self=[super init]) { 
     [self populateMenuArray]; 
     [self parseXML:menuData]; 
    } 

    return self; 
} 

dove menuData è il ritorno NSData ed dal tuo URL. Si potrebbe creare il modello utilizzando

self.deliData=[[DeliData alloc]init:menuData]; 

Tutta la classe è disponibile qui - https://gist.github.com/paulw11/da11ab3c7688c6deb1d7

+0

controlla la chat quando ne hai la possibilità –

+0

@daveneedleman - Vedi chat – Paulw11

+0

vedi chat lksjaf – iqueqiorio

0

Utilizzare questa

-(id)init:(NSData *)menuData { 
if (self=[super init]) { 
    [self populateMenuArray]; 
    [self parseXML:menuData]; 
} 

return self; 

}

Problemi correlati