将 JSON 元素放入 TableView 作为 Sections Title 和 Cell title
Posted
技术标签:
【中文标题】将 JSON 元素放入 TableView 作为 Sections Title 和 Cell title【英文标题】:Put JSON elements in TableView as Sections Title and Cell title 【发布时间】:2016-12-17 11:38:44 【问题描述】:下面是JSON,需要把它放在表格视图中,这样“subitemname”就变成了section标题,“subtosubitemname”变成了cell的标题。 我正在尝试,但没有成功。
部分标题已就位,但未检索行标题。
这是我试过的代码。
- (void)viewDidLoad
[super viewDidLoad];
NSString *urlString = [NSString stringWithFormat:@"URL"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"GET"];
NSError *error;
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *str=[[NSString alloc]initWithData:returnData encoding:NSUTF8StringEncoding];
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&error];
NSArray *DATAA=[jsonDict objectForKey:@"Menu"];
subid=[DATAA valueForKey:@"subitemid"];
subname=[DATAA valueForKey:@"subitemname"];
NSArray *sub= [DATAA valueForKey:@"Submenu"];
_SubItemName=[sub valueForKey:@"subtosubitemname"];
_SubItemId=[sub valueForKey:@"subtosubitemid"];
#pragma mark - Table view data source
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
return [subname objectAtIndex:section];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [subid count];
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [_SubItemId count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
cell=[tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSArray *subn=[_SubItemName objectAtIndex:indexPath.section];
cell.textLabel.text=[subn objectAtIndex:indexPath.row];
return cell;
其中 subname 是具有“subitemname”对象的数组,_SubItemName 是具有“subtosubitemname”对象的数组。
"Menu":
["subitemid":1,
"itemid":1,
"subitemname":"TELEVISIONS",
"ordernum":1,
"Submenu":
[
"subitemid":1,
"subtosubitemid":1,
"itemid":1,
"subtosubitemname":"FULL HD TV",
"subitemid":1,
"subtosubitemid":2,
"itemid":1,
"subtosubitemname":"SMART TV"
]
,
"subitemid":2,
"itemid":1,
"subitemname":"AUDIO & VIDEO",
"ordernum":2,
"Submenu":
[
"subitemid":2,
"subtosubitemid":3,
"itemid":1,
"subtosubitemname":"HOME AUDIO SYSTEMS"
,
"subitemid":2,
"subtosubitemid":4,
"itemid":1,
"subtosubitemname":"DTH SERVICES"
,
"subitemid":2,
"subtosubitemid":5,
"itemid":1,
"subtosubitemname":"AUDIO & VIDEO ACCESSORIES"
,
"subitemid":2,
"subtosubitemid":11,
"itemid":1,
"subtosubitemname":"PROJECTORS"
]
,
"subitemid":3,
"itemid":1,
"subitemname":"LARGE APPLIANCES",
"ordernum":3,
"Submenu":
[
"subitemid":3,
"subtosubitemid":14,
"itemid":1,
"subtosubitemname":"WASHING MACHINES & DRYERS"
,
"subitemid":3,
"subtosubitemid":16,
"itemid":1,
"subtosubitemname":"AIR CONDITIONERS"
,
"subitemid":3,
"subtosubitemid":18,
"itemid":1,
"subtosubitemname":"REFRIGERATORS"
,
"subitemid":3,
"subtosubitemid":19,
"itemid":1,
"subtosubitemname":"INVERTERS & BATTERIES"
]]
【问题讨论】:
显示您将 json 响应转换为 nsarray 的代码在哪里? @HimanshuMoradiya 我添加了代码 @Shikha 第一件事...永远不要以大写字母开头您的变量名.. 现在解决您的问题.. 一个数组就足够了,即..menu=[jsonDict objectForKey:@"Menu"];
将此数组用于您的所有方法喜欢numberOfSectionsInTableView
。它应该是 [menu count]
与其他方法一样
@EICaptainv2.0 以及在 cellForRowAtIndexPath 中做什么?
@Shikha 如果您理解我在之前的评论中所说的话,这很简单......只需使用menu[indexPath.section][@"Submenu"][indexPath.row][@"subtosubitemname"]
,您还需要更改其他 tableview 方法来实现这一点
【参考方案1】:
NSMutableArray *menuData = [jsonDict objectForKey:@"Menu"];
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
return [[menuData objectAtIndex:section] objectForKey:@"subitemname"];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [menuData count];
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSArray *subMenuData = [[menuData objectAtIndex:section] objectForKey:@"Submenu"];
return [subMenuData count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
cell=[tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSDictionary *cellData = [[[menuData objectAtIndex:section] objectForKey:@"Submenu"] objectAtIndex:indexPath.row];
cell.textLabel.text=[cellData objectForKey:@"subtosubitemname"];
return cell;
希望这对你有用。
【讨论】:
这行 NSDictionary *cellData = [[[menuData objectAtIndex:section] objectForKey:@"Submenu"] objectAtIndex:indexPath.row]; put NSDictionary *cellData = [[[menuData objectAtIndex:indexPath.section] objectForKey:@"Submenu"] objectAtIndex:indexPath.row];【参考方案2】:试试这个……一个数组就够了……menu = [jsonDict objectForKey:@"Menu"];
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
return menu[indexPath.section][@"subitemname"];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [menu count];
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSArray *submenu = menu[indexPath.section][@"Submenu"];
return [submenu count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
cell=[tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSArray *submenu = menu[indexPath.section][@"Submenu"];
cell.textLabel.text = submenu[indexPath.row][@"subtosubitemname]";
return cell;
【讨论】:
以上是关于将 JSON 元素放入 TableView 作为 Sections Title 和 Cell title的主要内容,如果未能解决你的问题,请参考以下文章
如何将 JSON 获取到 Swift 到 tableView 作为部分和行?