UITableview 没有重新加载
Posted
技术标签:
【中文标题】UITableview 没有重新加载【英文标题】:UITableview not reloading 【发布时间】:2011-09-07 07:00:59 【问题描述】:我有一个tableview
第一次正确加载,但是当我调用方法loadJsonData
时它应该重新加载数据。 reloadData
方法在loadJsonData
方法结束时被调用。但是tableview
没有重新加载。在调用reloadData
方法之前更新数据源。 tableview
的delegate和dataSource也设置为self。
我检查了它是否正在执行numberOfRowsInSection
方法,发现它没有执行该方法。有人可以帮帮我吗?
下面是代码:
-(void)loadJsonData:(NSString *)fileName:(int )count
titleArray=[[NSMutableArray alloc]init];
dateArray=[[NSMutableArray alloc]init];
descriptionArray=[[NSMutableArray alloc]init];
urlArray=[[NSMutableArray alloc]init];
thumbnailArray=[[NSMutableArray alloc]init];
NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"json"];
NSString *fileContent = [[NSString alloc] initWithContentsOfFile:filePath];
SBJSON *Parser = [[SBJSON alloc] init];
NSDictionary *data = (NSDictionary *) [Parser objectWithString:fileContent error:nil];
NSArray *items=[data objectForKey:fileName];
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"date"
ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [items sortedArrayUsingDescriptors:sortDescriptors];
items=sortedArray;
for (NSDictionary *item in items)
NSString *temp=[item objectForKey:@"title"];
NSString* str = [temp stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[titleArray addObject:str];
temp=[item objectForKey:@"date"];
[dateArray addObject:temp];
temp=[item objectForKey:@"thumbnailURL"];
str = [temp stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[thumbnailArray addObject:str];
temp=[item objectForKey:@"description"];
str = [temp stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[descriptionArray addObject:str];
temp=[item objectForKey:@"htmlURL"];
str = [temp stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[urlArray addObject:str];
[Parser release];
if (count==1)
[tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
NSLog(@"reload data test");
-(NSInteger) numberOfSectionsInTableView:(UITableView *)aTableView
// Return the number of sections.
return 1;
-(NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section
// Return the number of rows in the section.
NSLog(@"nof rows test..");
return [thumbnailArray count];
编辑
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
CustomCell *cell;
cell=(CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil)
cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"cell"] autorelease];
cell.contentMode=UIViewContentModeScaleAspectFit;
cell.Title.text=[titleArray objectAtIndex:indexPath.row];
cell.description.text=[descriptionArray objectAtIndex:indexPath.row];
NSURL *url = [NSURL URLWithString:[thumbnailArray objectAtIndex:indexPath.row]];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [[UIImage alloc] initWithData:data];
cell.Image.image=img;
cell.Date.text=[dateArray objectAtIndex:indexPath.row];
NSLog(@"date is : %@",cell.Date.text);
cell.selectionStyle=UITableViewCellSelectionStyleNone;
return cell;
【问题讨论】:
验证数据源和委托是否设置正确。 在界面Builder数据源和委托连接到文件所有者。 还要验证 thubnailArray 并贴出 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 的代码。 我也验证了 thumbnailArray。它正在正确更新。 我也在添加 cellForRowAtIndexPath 方法。 【参考方案1】:首先检查节数。如果由于某种原因您的代码返回 0,则不会调用任何其他委托函数。
【讨论】:
谢谢老板 :) 我什么都试过了,但这只对我有用。【参考方案2】:我不禁觉得您的 performSelectorOnMainThread:
有点多余,可能会导致您的问题,尽管我不明白为什么。你能不能只用:[tableview reloadData];
我的@iPhoneiPadDev 提供的答案指出了我错过的缺陷。将您的 if 更改为 if (count >= 0)
【讨论】:
我也试过[tableview reloadData]。仍然没有重新加载。计数值为0或1。如果计数值为1,我想重新加载。【参考方案3】:你必须使用以下。
if (count > 0)
[tableview reloadData];
NSLog(@"reload data test");
【讨论】:
感谢您的回复。“count”实际上是传递给“loadJsonData”方法的参数。它实际上并不代表数据源计数。无论如何,它正在执行该条件,我正在能够在控制台中看到“重新加载数据测试”。抱歉命名约定不佳。【参考方案4】:修改您的代码,如下所示...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
CustomCell *cell;
cell=(CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil)
cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"cell"] autorelease];
cell.contentMode=UIViewContentModeScaleAspectFit;
cell.Title.text=[titleArray objectAtIndex:indexPath.row];
cell.description.text=[descriptionArray objectAtIndex:indexPath.row];
NSURL *url = [NSURL URLWithString:[thumbnailArray objectAtIndex:indexPath.row]];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [[UIImage alloc] initWithData:data];
cell.Image.image=img;
cell.Date.text=[dateArray objectAtIndex:indexPath.row];
NSLog(@"date is : %@",cell.Date.text);
cell.selectionStyle=UITableViewCellSelectionStyleNone;
return cell;
【讨论】:
感谢您的回复。我修改了它......仍然没有工作。在我的代码中,“numberOfRowsInSection”方法没有执行。因此,如果我没记错的话,我认为“reloadData”方法没有被执行。【参考方案5】:99.99% 的问题仅与 tableview
的设置 delagate
和 dataSource
相关(或者如果您从 xib 设置它们,您可能没有保存 xib)如果 numberOfRowsInSection
没有被调用。
删除所有代表。重新分配代表并确保您保存所有文件,包括 xib。
【讨论】:
以上是关于UITableview 没有重新加载的主要内容,如果未能解决你的问题,请参考以下文章