我有一个TableView加载自定义单元格并从服务器上的JSON字符串加载数据。 JSON字符串被解析为包含14个ID(id_array)的数组。
如果cell==nil
,那么我正在使用[id_array objectAtIndex:indexPath.row]
获取ID并从服务器获取有关该行的更多信息,并设置单元格的标签和图像。
运行应用程序时,UITableView正在加载可见行[0,1,2,3,4](单元格高度为70px)。 向下滚动TableView时,加载了行[5]并从服务器获取数据,但问题是超出这一点 - TableView重复这6行而不是从服务器请求新行的新行...
但它确实为行[5]请求新数据,当应用程序首次运行时,该数据不可见(并且未加载)。
任何人都知道为什么会这样? 谢谢!
编辑:这是我的cellForRowAtIndexPath方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CustomCell";
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
for (id currentObject in topLevelObjects) {
if ([currentObject isKindOfClass:[UITableViewCell class]]) {
cell = (CustomCell *)currentObject;
NSString *appsURL = [NSString stringWithFormat:@"http://myAPI.com?id=%@",[app_ids objectAtIndex:indexPath.row]];
NSLog(@"row -> %d | id -> %@",indexPath.row,[app_ids objectAtIndex:indexPath.row]);
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:appsURL]];
[cell updateAppInfoForCellWithRequest:request];
break;
}
}
}
// Configure the cell...
return cell;
}
答案 0 :(得分:3)
如果您仅在cell==nil
设置数据,那么这就是您的问题。 UITable构建表视图单元格的缓存,如果单元格为零,则仅创建一个新缓存。因此,必须每次都设置数据,即cell==nil
块之外。
以下示例显示了该过程。首先,从池中获取一个单元格,如果没有空闲单元格,则创建一个新单元格。设置相应行的单元格值。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
id someData = [id_array objectAtIndex:indexPath.row]
cell.textLabel.text = [someData someString];
return cell;
}