分段UITable和JSON

我已经尝试了几天来弄清楚如何将这个JSON解析为分段的UITable但是我没有成功,我只能弄清楚如何获取节名,但未能获得每个节的行数和数据对于每个部分中的每一行。

由于运输组可能会不时变化,并且他们的名字可能会改变,所以我想我需要使用allKeys来查找每个部分标题第1。

请帮助并指出正确的方向来提取UITable的分段数据,谢谢。

{ "transport" : { "public" : [ { "transport_id" : "2", "transport_name" : "Ferry" }, { "transport_id" : "3", "transport_name" : "Bus" }, { "transport_id" : "4", "transport_name" : "Taxi" }, { "transport_id" : "5", "transport_name" : "Tram" } ], "Private" : [ { "transport_id" : "11", "transport_name" : "Bicycle" }, { "transport_id" : "12", "transport_name" : "Private Car" } ], "Misc" : [ { "transport_id" : "6", "transport_name" : "By Foot" }, { "transport_id" : "7", "transport_name" : "Helicopter" }, { "transport_id" : "8", "transport_name" : "Yatch" } ] } } NSDictionary *results = [jsonString JSONValue]; NSDictionary *all = [results objectForKey:@"transport"]; NSArray *allKeys = [all allKeys]; NSArray *transports = [results objectForKey:@"transport"]; for (NSDictionary *transport in transports) { [transportSectionTitle addObject:(transport)]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [transportSectionTitle count]; } 

最简单的解释是使用all字典作为数据源。

 NSDictionary *results = [jsonString JSONValue]; NSDictionary *all = [results objectForKey:@"transport"]; // self.datasource would be a NSDictionary retained property self.datasource = all; 

然后获取您可以执行的部分数量:

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [self.datasource count]; // You can use count on a NSDictionary } 

要获得部分的标题:

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

要获取每个部分中的行数:

 - (NSInteger)tableView:(UITableView *)favTableView numberOfRowsInSection:(NSInteger)section { // Get the all the transports NSArray *allTransports = [self.datasource allValues]; // Get the array of transports for the wanted section NSArray *sectionTransports = [allTransports objectAtIndex:section]; return [sectionTransports count]; } 

然后获取行:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } // Get the all the transports NSArray *allTransports = [self.datasource allValues]; // Get the array of transports for the wanted section NSArray *sectionTransports = [allTransports objectAtIndex:indexPath.section]; // Then get the transport for the row NSDictionary *transport = [sectionTransports objectAtIndex:indexPath.row]; // Now you can get the name and id of the transport NSString *tansportName = [transport objectForKey:@"transport_name"]; NSString *transportId = [transport objectForKey:@"transport_id"]; NSString *transportDescription = [NSString stringWithFormat:@"%@ - %@",transportId, transportName]; cell.textLabel.text = transportDescription; return cell; } 

无论如何,这是它的要点。

您可能希望将allKeysallValues数组存储为类属性,而不必在所有tableview的委托和数据源方法中完成它们,但是您应该拥有现在构建yuor表的所有信息。

希望这可以帮助 :)

你需要做的关键是认识到,一旦你的JSON字符串被解析成一个对象,它就会变成一系列嵌套的NSArrays和NSDictionarys,你只需要适当地钻取这些值

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [[transports allKeys] count]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [(NSArray*)[transports objectForKey:[[transports allKeys] objectAtIndex:section]] count]; } - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { return [transports allKeys]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } // get transport category (eg"public") NSString *transportCategory = (NSString*)[[transports allKeys] objectAtIndex:[indexPath section]]; // get transport items belonging to the category NSArray *items = (NSArray*)[transports objectForKey:transportCategory]; // get transport item for this row NSDictionary *transportItem = [items objectAtIndex:[indexPath row]]; // extract values of transport item NSString *transportName = [transportItem objectForKey:@"transport_name"]; NSString *transportID = [transportItem objectForKey:@"transport_id"]; cell.textLabel.text = transportName; return cell; } 
 NSDictionary *results = [jsonString JSONValue]; NSDictionary *allTypes = [results objectForKey:@"transport"]; NSArray *allTransportKeys = [allTypes allKeys]; 

部分数量:

 NSInteger numberOfSections = [allKeys count]; 

部分中的行数:

 NSString *key = [allKeys objectAtIndex:section]; NSArray *array = [allTypes objectForKey:key]; NSInteger numberOfRows = [array count]; 

indexPath中的数据:

 NSString *key = [allKeys objectAtIndex:indexPath.section]; NSArray *array = [allTypes objectForKey:key]; NSDictionary *itemDict = [array objectAtIndex:indexPath.row]; 

然后,您可以从itemDict中提取数据。