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 的设置 delagatedataSource 相关(或者如果您从 xib 设置它们,您可能没有保存 xib)如果 numberOfRowsInSection 没有被调用。

删除所有代表。重新分配代表并确保您保存所有文件,包括 xib。

【讨论】:

以上是关于UITableview 没有重新加载的主要内容,如果未能解决你的问题,请参考以下文章

UITableview 没有重新加载

UITableView 没有重新加载

UITableView 没有正确重新加载

SwiftyJSON 没有重新加载 UITableView

UITableView 没有在 reloadData 上重新加载

为啥我的函数没有重新加载 UITableView 的数据?