我启动了一个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;
}
答案 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),然后只需重新加载表。如果您希望新数据以底部或任何特定顺序显示,则应该对数据源(数组)执行此操作。