我无法在我的UITableView中加载超过40个UITableViewCell

时间:2012-08-24 20:06:53

标签: ios uitableview pagination

我正在解析使用PHP获取MySQL数据库中前25项的XML - LIMIT和GET。当我点击附加到我的tableview底部的“加载更多”单元格时,它成功获取了接下来的25个项目,但只加载前40个项目并从最后10个项目中删除。每次我点击“加载更多” “它增加25到我的范围(即0-25,25-50),但似乎我的范围上限为65,显示上限为40。

这是我的加载功能不起作用:

-(void) getNewRange{
    int currentRange = [allItems count];
    int newRange = currentRange + 25;

    if(newRange > [xmlParser total]){
        NSLog(@"evaluating as greater than the total, which is 837");
        newRange = [xmlParser total];
    }

    NSString *range = [[NSString alloc] initWithFormat:@"?range=%d&range2=%d",currentRange,newRange];
    NSString *newUrl =[[NSString alloc] initWithFormat:@"http://localhost/fetchAllTitles.php%@",range];

    XMLParser *tempParser = [[XMLParser alloc] loadXMLByURL:newUrl];
    [allItems addObjectsFromArray:[tempParser people]];
    NSMutableArray *newCells = [[NSMutableArray alloc] initWithCapacity:25];

    for(int i=currentRange;i<newRange;i++){
        NSLog(@"%d",i);
         NSIndexPath *indexpath=[NSIndexPath indexPathForRow:i inSection:0];
        [newCells addObject:indexpath];
    }

    NSLog(@"%@",newUrl);

    [self.tableView insertRowsAtIndexPaths:newCells withRowAnimation:UITableViewRowAnimationAutomatic];
}

我越来越近了,但是我收到了这个新错误:

*** Assertion failure in -[_UITableViewUpdateSupport _computeRowUpdates], /SourceCache/UIKit_Sim/UIKit-1912.3/UITableViewSupport.m:386

3 个答案:

答案 0 :(得分:4)

了解如何重新使用表格视图的单元格

您的数据不需要由单元格“拥有”。

答案 1 :(得分:3)

UITableView不是包含数据的类,您不应该尝试直接微观管理它显示的单元格。正如另一张海报所述,请阅读如何使用它。你应该做的是:

-(void)loadNewData
{
    NSIndexPath *index;
    XMLParser *tempParser = [[XMLParser alloc] loadXMLByURL:newUrl];
    NSArray *people=[tempParser people];
    for(id *person in people)
    {
        [self.dataArray addObject:person];
        indexPath=[NSIndexPath indexPathForRow:[self.dataArray indexForObject:person] inSection:0];
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{ 
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [AnArray count];//use whatever array stores your data
}


//If you've subclassed the cell, adjust appropriately.
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (!cell) {
        cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
    //Customize the cell
    return cell;
}

如果您允许,表视图将处理显示单元格所涉及的所有逻辑。这样,您在任何给定时间只有有限数量的单元占用内存,而您不必处理 - 表视图自动处理重用单元,并知道在/之前需要多少个作为缓冲区后。

答案 2 :(得分:2)

你不应该在你的方法中设置numberOfRowsInSection。应该从tableView的数据源方法- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section返回行数。只需返回[allItems count]