我在我的应用程序中成功解析了json文件,但是当我试图在表格视图中显示它时,它没有显示出来。我的代码就是这样。
NSString *urlstr=[NSString stringWithFormat:@"http://minora.p41techdev.net/portal.php"];
NSURL *url=[NSURL URLWithString:urlstr];
NSData *data =[NSData dataWithContentsOfURL:url];
NSError *error;
NSArray *json=(NSMutableArray*) [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
//NSLog(@"%@",json);
NSDictionary *dict =[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"a title", @"more data",nil] forKeys:[NSArray arrayWithObjects:@"titleKey",@"dataKey", nil]];
NSLog(@"1");
NSString *integ = [dict valueForKey:@"id"];
NSString *title=[dict valueForKey:@"title"];
NSString *category=[dict valueForKey:@"category"];
NSString *description=[dict valueForKey:@"description"];
NSString *spectitle=[dict valueForKey:@"spectitle"];
NSString *specvalue=[dict valueForKey:@"specvalue"];
NSArray *arr =[NSArray arrayWithObjects:integ,title,category,description,spectitle,specvalue, nil];
[tablearray addObject:arr];
NSLog(@"%@",tablearray);
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//#warning Incomplete method implementation.
// Return the number of rows in the section.
return [tablearray count];
NSLog(@"5");
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.textLabel.text=[[tablearray objectAtIndex:indexPath.row] objectAtIndex:1];
return cell;
}
我的json文件看起来像这样
[
{
"id": "1",
"category": "New Category1",
"title": "New Product2",
"description": "Please type a description1",
"imgurl": "http://s.wordpress.org/about/images/wordpress-logo-notext-bg.png",
"spectitle": "Specification",
"specvalue": "Value"
},
{
"id": "2",
"category": "Mobile",
"title": "Samsung",
"description": "Please type a description",
"imgurl": "http://s.wordpress.org/about/images/wordpress-logo-notext-bg.png",
"spectitle": "Price",
"specvalue": "100$"
}
]
指导请...
我正在接受像这样的线程问题
2012-07-20 19:36:03.504 tablevc[2253:f803] 1
2012-07-20 19:36:03.505 tablevc[2253:f803] 2
2012-07-20 19:36:03.507 tablevc[2253:f803] 4
2012-07-20 19:36:03.507 tablevc[2253:f803] 3
2012-07-20 19:36:03.508 tablevc[2253:f803] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:6061
2012-07-20 19:36:03.508 tablevc[2253:f803] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
*** First throw call stack:
(0x13d2022 0x1563cd6 0x137aa48 0x9b32cb 0xb6d28 0xb73ce 0xa2cbd 0xb16f1 0x5ad21 0x13d3e42 0x1d8a679 0x1d94579 0x1d194f7 0x1d1b3f6 0x1d1aad0 0x13a699e 0x133d640 0x13094c6 0x1308d84 0x1308c9b 0x12bb7d8 0x12bb88a 0x1c626 0x2ae2 0x2a55 0x1)
terminate called throwing an exception
答案 0 :(得分:3)
我没有在任何地方看到tablearray的初始化。
将此添加到viewDidLoad方法:
tablearray = [[NSMutableArray alloc] init];
我也看到你在数组中插入一个数组。这意味着当您需要访问正确的数据(在您的情况下为NSString)时,您必须使用正确的索引:
cell.textLabel.text=[[tablearray objectAtIndex:indexPath.row] objectAtIndex:1];
我使用“objectAtIndex:1”,因为标题字符串存储在内部数组的索引1处。更好,更通用的方法是使用NSDictionary。例如:
NSDictionary *dict =[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"a title", @"more data",nil] forKeys:[NSArray arrayWithObjects:@"titleKey",@"dataKey"]];
另外,请确保您的代理人为您的表格返回正确数量的部分。
答案 1 :(得分:2)
tableview中的部分数量至少为一个...
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//#warning Potentially incomplete method implementation.
// Return the number of sections.
return 1;//It should be at least one.......
}
在cellForRowAtIndexPath:
方法中编写以下代码。否则你会收到错误。
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
我认为这会对你有所帮助。
答案 2 :(得分:1)
调用[tableView reloadData]
[tablearray addObject:arr];
[tableView reloadData]
NSLog(@"2");
希望有所帮助
答案 3 :(得分:1)
你应该像这样初始化单元格:
- (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];
}
[[cell textLabel] setText:[tablearray objectAtIndex:indexPath.row]];
// Configure the cell...
return cell;
}
答案 4 :(得分:1)
你有一个带有1个元素的tablarray。此元素是包含几个条目的数组。 您的数据源仅声明一个单元格(tablearray计数,即一个)。
你的cellForIndexPath方法总是会在json数组中查找第一个也是唯一的第一个元素。
编辑:不相关,但是如果你的json中的某个字段没有设置,你将会返回nil,并且会在arrayWithObjects中终止你的数组,这可能会导致一个超出范围的索引。 小心翼翼地使用这种方法,用它来拍摄自己很容易。