重复的UItableViewCell,UITableView的行

时间:2013-01-11 13:30:21

标签: iphone ios uitableview

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

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

这里发生的任何想法,图像只在一个对象中,在第一次加载时它显示一个带有图像的单元格,但滚动后它开始在其他单元格上显示图像

7 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

UITableViewCells被重用,这就是dequeueReusableCellWithIdentifier:方法所做的。为了节省内存,UITableView仅实例化在任何给定点可以看到的单元格数,然后继续重用它们。因此,您应该在重新使用之前清理您的单元格,将其所有内容重置为nil

如果您使用的是自定义表格视图HomeCell,请覆盖 - (无效)prepareForReuse并将图像设置为nil。

希望有所帮助。

答案 2 :(得分:1)

it is happening because your cell is reuse so write this code

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

答案 3 :(得分:0)

你需要一个else语句。尝试:

else {
venueObj = nil;
}

答案 4 :(得分: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;
}

答案 5 :(得分:0)

试试这个:

if(venueObj.ivVenue)
{
        [cell.ivVenue setImage:venueObj.ivVenue];
}
else
{
       cell.ivVenue.image = Nil;
}

答案 6 :(得分:0)

您只需在cellForRowAtIndexPath

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

并更改

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

这可能对您有所帮助;)