分段表转 JSON
Posted
技术标签:
【中文标题】分段表转 JSON【英文标题】:Sectioned UITable & JSON 【发布时间】:2012-01-27 08:12:58 【问题描述】:我几天来一直在尝试弄清楚如何将此 JSON 解析为分段的 UITable,但我没有成功,我只能弄清楚如何获取部分名称,但未能获取每个部分行每个部分中每一行的计数和数据。
由于运输组可能不时变化,名称可能会改变,所以我想我需要使用 allKeys 找出每个部分的标题。
请帮助并指出正确的方向来提取分段 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];
【问题讨论】:
你想说运输,公共私人错过这些变化或它们里面的数据随着时间的推移而变化。 【参考方案1】:最容易解释的解决方案是使用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;
这就是它的要点。
您可能希望将 allKeys
和 allValues
数组存储为类属性,而不必在 tableview 的所有委托和数据源方法中遍历它们,但您现在应该拥有构建 yuor 表的所有信息。
希望这会有所帮助:)
【讨论】:
谢谢,您的回答非常详细,对我帮助很大。通常,一旦收到 JSON,我会将所有值分配给 NSMutableArray...【参考方案2】:你需要做的关键是认识到一旦你的 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 (e.g."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;
【讨论】:
感谢您的回答,它也有帮助,但是 Mutix 的回答更完整,所以我将其标记为我的选择 =)【参考方案3】: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 中提取数据了。
【讨论】:
以上是关于分段表转 JSON的主要内容,如果未能解决你的问题,请参考以下文章