0

在这里上下滚动 2 3 次后的 tableview 将图像添加到所有单元格。这是代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

HomeCell *cell = (HomeCell *) [tableView dequeueReusableCellWithIdentifier:@"HomeCell"];
if (cell == nil) {
    cell = [[HomeCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"HomeCell"] ;
}

VenueDC *venueObj = [subSubCategoriesArray objectAtIndex:indexPath.row];
cell.lblName.text = venueObj.name;
if ([venueObj.imagesArray count] > 0) {
    [cell.ivVenue setImage:venueObj.ivVenue];
    [cell.ivVenue setHidden:NO];
    cell.lblName.frame = CGRectMake(80, cell.lblName.frame.origin.y, 200, cell.lblName.frame.size.height);
}
venueObj = nil;


return  cell;
}

知道这里发生了什么吗?

图像仅在一个对象中,第一次加载时它显示一个带有图像的单元格,但滚动后它也开始在其他单元格上显示图像。

4

6 回答 6

3

像这样解决它,首先我将 lblName 框架设置为其原始位置,因此每次使用单元格时它都会重置其位置

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

HomeCell *cell = (HomeCell *) [tableView dequeueReusableCellWithIdentifier:@"HomeCell"];

if (cell == nil) {

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"HomeCell" owner:self options:nil];

    for (id currentObject in topLevelObjects){
        if ([currentObject isKindOfClass:[UITableViewCell class]]){
            cell =  (HomeCell *) currentObject;
            break;
        }
    }
}

VenueDC *venueObj = nil;
venueObj = [subSubCategoriesArray objectAtIndex:indexPath.row];
cell.lblName.text = venueObj.name;
[cell.ivVenue setHidden:YES];
cell.lblName.frame = CGRectMake(20 , 19, 250, 20);
if (venueObj.ivVenue) {
    [cell.ivVenue setImage:venueObj.ivVenue];
    [cell.ivVenue setHidden:NO];
    cell.lblName.frame = CGRectMake(80, cell.lblName.frame.origin.y, 200, cell.lblName.frame.size.height);
} 
return  cell;
}
于 2013-01-11T13:58:05.757 回答
2

UITableViewCells被重用,这就是dequeueReusableCellWithIdentifier: 方法的作用。为了节省内存,UITableView唯一的实例是在任何给定点上尽可能多地实例化单元格,然后继续重复使用它们。因此,您应该始终在重用之前清理您的单元格,即将其所有内容重置为nil.

如果您使用的是自定义表格视图,例如您的情况HomeCell,则覆盖 -(void)prepareForReuse并将图像设置为 nil 。

于 2013-01-11T13:33:45.150 回答
1

发生这种情况是因为您的单元格被重用,因此请编写以下代码:

HomeCell *cell = (HomeCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"HomeCell" owner:self options:nil];
        
        for (id currentObject in topLevelObjects){
            if ([currentObject isKindOfClass:[UITableViewCell class]]){
                cell =  (HomeCell *) currentObject;
                break;
            }
        }
    }
于 2013-01-11T13:39:13.777 回答
0

你需要一个else声明:

else {
venueObj = nil;
}
于 2013-01-11T13:32:42.033 回答
0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

HomeCell *cell = (HomeCell *) [tableView dequeueReusableCellWithIdentifier:@"HomeCell"];
if (cell == nil) {
    cell = [[HomeCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"HomeCell"] ;
}

VenueDC *venueObj = [subSubCategoriesArray objectAtIndex:indexPath.row];
cell.lblName.text = venueObj.name;
    [cell.ivVenue setImage:nil];

if ([venueObj.imagesArray count] > 0) {
    [cell.ivVenue setImage:venueObj.ivVenue];
    [cell.ivVenue setHidden:NO];
    cell.lblName.frame = CGRectMake(80, cell.lblName.frame.origin.y, 200, cell.lblName.frame.size.height);
}
venueObj = nil;


return  cell;
}
于 2013-01-11T13:35:02.677 回答
0

您只需要添加一行cellForRowAtIndexPath

NSString *CellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];

并改变

HomeCell *cell = (HomeCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
于 2013-01-11T13:38:35.640 回答