我用google搜索并从我这边做了很多研究,以找出为什么tableview上的reloadData方法不起作用。我检查了所有可能的解决方案,例如设置了数据源,设置了委托,tableview连接到文件的所有者。
毕竟,当我试图重新加载tableview时,没有。调用rows方法,但不调用rowAtIndexPath的单元格。下面是我写的代码。请让我知道,我哪里出错了
- (void)onReservationListSuccess:(NSArray *)rData
{
if ( rData != nil )
{
resList = [[NSArray alloc] initWithArray:rData];
if([resList count] > 0)
{
[self.tripsTableView reloadData];
//[self.tripsTableView beginUpdates];
//[self.tripsTableView reloadSections:[NSIndexSet indexSetWithIndex:0]
// withRowAnimation:UITableViewRowAnimationNone];
//[self.tripsTableView endUpdates];
}
else
{
[tripsTableView reloadData];
[tripsTableView setHidden:YES];
[noTripsLabel setHidden:NO];
}
}
if(fsnNeedsRefresh == YES)
{
[[NSNotificationCenter defaultCenter] postNotificationName:UpdateFSNList object:nil];
fsnNeedsRefresh = NO;
}
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int temp=[resList count];
NSLog(@"The no. of rows are %d", temp);
NSLog(@"Testing Purpose");
NSLog(@"The pnr details of the object is:%@",((TripData *)[resList objectAtIndex:0]).pnrDescription);
return 1;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"The cell for the row at indexpath is getting called");
static NSString *CellIdentifier = @"TripCellIdentifier";
TripCell *cell = (TripCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TripCell" owner:self options:nil];
for(id oneObject in nib)
if([oneObject isKindOfClass:[TripCell class]])
cell = (TripCell *)oneObject;
}
// Set up the cell...
TripData *tripData = (TripData *)[resList objectAtIndex:indexPath.row];
cell.pnrLabel.text = tripData.pnr;
NSLog(@"The cell text is %@",tripData.pnr);
cell.pnrDescriptionLabel.text = tripData.pnrDescription;
NSLog(@"The cell text is %@",tripData.pnrDescription);
cell.pnrTypeLabel.text = tripData.pnrType;
NSLog(@"The cell text is %@",tripData.pnrType);
if(checkInAllowed)
{
cell.checkInButton.tag = indexPath.row;
[cell.checkInButton addTarget:self action:@selector(checkIn:) forControlEvents:UIControlEventTouchUpInside];
}
else
{
[cell.checkInButton setEnabled:NO];
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here. Create and push another view controller
TripData *tripData = (TripData *)[resList objectAtIndex:indexPath.row];
NSLog(@"%@", tripData.pnr);
if(tripData != nil)
{
TripOverviewViewController *tripOverviewViewController = [[TripOverviewViewController alloc] initWithTrip:tripData];
[self.navigationController pushViewController:tripOverviewViewController animated:YES];
[tripOverviewViewController release];
}
[tableView deselectRowAtIndexPath:indexPath animated:NO];
}
答案 0 :(得分:3)
从代码的这一部分我不能确切地说它为什么不起作用,但我会尝试解释reloadData
的工作原理。
首先,UITableView
的工作原理:基本上,它是一个滚动视图。绘制它时,它会检查它有多少行,然后检查它们的高度,从它的大小和滚动位置确定当前显示的行数。然后它要求委托为每个显示的行返回UITableViewCell
。
当滚动表时,它会从视图层次结构中删除隐藏的单元格,并添加已出现的单元格。
现在是棘手的部分 - reloadData
做了什么?它只是从表层次结构中删除所有UITableViewCell
。而已。在reloadData
之后第一次绘制表格时,将完成实际更新。
所以,我的建议是 - 检查你的桌子是否被隐藏并检查它的框架。此外,我发现您正在访问属性getter self.tripsTableView
和ivar tripsTableView
。这令人困惑。他们都退回了吗?