简体   繁体   中英

Load more UICell in the bottom of the UITableView

I started an iOS project and I'm working with UITableView to display a list of pilots with images . I did pagination on my api and I tried to load more once you scrolled the tableview. the problem that I got is that the new cells are always displayed on top of the tableview not in the bottom. Please check on my code if there is a solution I will be grateful

- (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;
}

Why you are taking 2 array _pilotsDisplay and _pilotsAll ?

If not necessary then you can also do pagination using one NSMutableArray which you can use in both cases while fetching data from server as well as while filling data to UITableView .

Remember one thing only initialise your NSMutableArray in viewDidLoad method. And when you received new data use addObject method of NSMutableArray which you are already using. And then call reloadData method of UITableView .

And in cellForRowAtIndexPath don't use calculation like [_pilotsDisplay count]-1-indexPath.row , simply use indexPath.row .

Here, inserting rows to the tableview may help you.

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

You shouldn't add cells to a tableview. what you should do is add data to the tableview's datasource (in your case, _pilotsDisplay) and then simply reload the table. If you want the new data to appear at bottom or in any particular order, you should do that to your datasource (the array).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM