在UITableView的底部加载更多UICell

时间:2017-01-11 04:55:26

标签: ios objective-c uitableview

我启动了一个iOS项目,我正在使用UITableView来显示带有图像的飞行员列表。我在api上做了分页,一旦你滚动了tableview,我试图加载更多。我得到的问题是新单元格总是显示在tableview的顶部而不是底部。请检查我的代码是否有解决方案我将不胜感激

- (void)loadData :(NSInteger)page {
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@%@%ld",NSLocalizedString(@"get_pilots",nil),mainDelegate.idAccount,@"?page=",(long)page]];
task = [restObject GET:url :mainDelegate.token completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    NSMutableDictionary* jsonResponse = [NSJSONSerialization
                                         JSONObjectWithData:data
                                         options:kNilOptions
                                         error:nil];
    NSArray *pilotKey = [jsonResponse objectForKey:@"pilot"];
    for (NSDictionary *pilotItem in pilotKey ){
        PilotObject *pilotObj = [PilotObject new];
        [pilotObj getPilot:pilotObj :pilotItem];
        [_pilotsAll addObject:pilotObj];
    }
    dispatch_async(dispatch_get_main_queue(), ^{
        [hud hideAnimated:YES];
        [self checkTableView:_pilotsDisplay :self.view];
        [viewPilots.tableViewPilots reloadData];
    });
}];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (currentPage == totalPages) {
    return [_pilotsDisplay count];
}
return [_pilotsDisplay count] + 1;
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == [_pilotsDisplay count] - 1 && currentPage<totalPages ) {
    [self loadData:++currentPage];
    NSLog(@"current page : = %ld",(long)currentPage);
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

if (indexPath.row == [_pilotsDisplay count]) {
    static NSString *identifier = @"PilotCellTableViewCell";
    PilotCellTableViewCell *cell = (PilotCellTableViewCell *)[tableView dequeueReusableCellWithIdentifier:identifier];
    cell.hidden=YES;
    UIActivityIndicatorView *activityIndicator = (UIActivityIndicatorView *)[cell.contentView viewWithTag:100];
    [activityIndicator startAnimating];
    return cell;

} else {
    PilotObject *pilotObjDisplay = nil;
    pilotObjDisplay = [_pilotsDisplay objectAtIndex:[_pilotsDisplay count]-1-indexPath.row];
    static NSString *identifier = @"PilotCellTableViewCell";
    PilotCellTableViewCell *cell = (PilotCellTableViewCell *)[tableView dequeueReusableCellWithIdentifier:identifier];
    cell.hidden=NO;
    cell.image.image = pilotObjDisplay.imageDisplayPilot;
    cell.titleLabel.text = pilotObjDisplay.firstName;
    cell.subTitleLabel.text = pilotObjDisplay.lastName;
    cell.backgroundColor = [UIColor colorWithHexString:NSLocalizedString(@"gray_background", nil)];
    return cell;
}
return nil;
}

3 个答案:

答案 0 :(得分:0)

为什么你要服用2个数组_pilotsDisplay和_pilotsAll?

如果没有必要,那么您也可以使用一个NSMutableArray进行分页,在从服务器获取数据以及将数据填充到UITableView时,您可以在两种情况下使用NSMutableArray

请记住,有一件事只能在viewDidLoad方法中初始化addObject。当您收到新数据时,请使用您已使用的NSMutableArray reloadData方法。然后调用UITableView的{​​{1}}方法。

并且在cellForRowAtIndexPath中不使用[_pilotsDisplay count]-1-indexPath.row之类的计算,只需使用indexPath.row

答案 1 :(得分:0)

在这里,向tableview插入行可能会对您有所帮助。

[tableView beginUpdates];
NSArray *paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:[dataArray count]-1 inSection:1]];
[[self tableView] insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationTop];
[tableView endUpdates];

答案 2 :(得分:0)

您不应将单元格添加到tableview。你应该做的是将数据添加到tableview的数据源(在你的情况下,_pilotsDisplay),然后只需重新加载表。如果您希望新数据以底部或任何特定顺序显示,则应该对数据源(数组)执行此操作。