UITableviewCell如何设置“ViewHolder”

时间:2013-06-25 07:58:41

标签: objective-c uitableview adapter

UITableView, CustomViewCell 呈现本地数组数据。 CustomViewCell的按钮“收藏夹” SELECTED更改为UNSELECTED

问题是向下滚动向下和向上,TableView 再次使用原始按钮的状态重新加载单元格。

如何在不重新加载的情况下保持细胞? 有一种方法可以像java“adapter / viewholder”一样使用吗?

谢谢大家。

主要课程:

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

    CommentCell *cellView;


    //    if(cellView == nil)
    //    {
    //        _article            = nil;
    //        cellView.lblAdress  = nil;
    //        cellView.lblName    = nil;
    //        cellView.webImageV  = nil;
    //        cellView.strPhone   = nil;
    //        // cell.btn            = nil;
    //    }


    if (!cellView) {

        NSArray *topLevelObjects;

        if([[[arrResultsALL objectAtIndex:indexPath.row] valueForKey:@"IsMain"]isEqualToString:@"false"])
        {
            topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CommentCell" owner:self options:nil];
        }


        if([[[arrResultsALL objectAtIndex:indexPath.row] valueForKey:@"IsMain"]isEqualToString:@"true"])
        {

            topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CommentCellBIG" owner:self options:nil];

        }

               cellView = [topLevelObjects objectAtIndex:0];

        }





    //    if ([[[arrResultsALL objectAtIndex:indexPath.row] valueForKey:@"AlreadyFavorite"]isEqualToString:@"true"]) {
    //
    //        [cellView.btn setSelected:YES];
    //    }
    //    else if ([[[arrResultsALL objectAtIndex:indexPath.row] valueForKey:@"AlreadyFavorite"]isEqualToString:@"false"]) {
    //        [cellView.btn setSelected:NO];
    //    }



    _article = [articles objectAtIndex:[indexPath row]];
    [cellView setArticle:_article];


    return cellView;

}

加载单元格数据:

-(void)loadArticle
{
    [articles removeAllObjects];

    for (int i =0; i<[arrResultsALL count]; i++)
    {
        _article = [[Comment alloc]initWithName:[[arrResultsALL objectAtIndex:i] valueForKey:@"name"]
                                         Adress:[[arrResultsALL objectAtIndex:i] valueForKey:@"address"]
                                       ImageURL:[[arrResultsALL objectAtIndex:i] valueForKey:@"logo"]
                                          ObjID:[[arrResultsALL objectAtIndex:i] valueForKey:@"id"]
                                          Phone:[[arrResultsALL objectAtIndex:i] valueForKey:@"phone"]
                                      Favorites:[[arrResultsALL objectAtIndex:i] valueForKey:@"AlreadyFavorite"]
                                         IsMain:[[arrResultsALL objectAtIndex:i] valueForKey:@"IsMain"]

                    ];



        [articles addObject:_article];
    }

}

**

  

CustomCell类:

**

-(void)setArticle:(Comment*)_article {

    self.webImageV.image = [UIImage imageNamed:@"AdPictureFrame"];

    if (!StringIsNilOrEmpty(_article.ImageURL)) {
        NSURL *animationUrl = [NSURL URLWithString:_article.ImageURL];
        if (!StringIsNilOrEmpty(animationUrl.pathExtension)) {
            self.webImageV.image = nil;
            [self.webImageV loadFromURL:animationUrl];
        }
    }


    self.strAlreadyFavorites=_article.AlreadyFavorites;
    self.strIsMain = _article.IsMain;


    NSLog(@"strAlreadyFavoritesstrAlreadyFavorites=%@",strAlreadyFavorites);

    if ([strAlreadyFavorites isEqualToString:@"true"]) {
        [self.btn setSelected:YES];
    }
    else
    {
        [self.btn setSelected:NO];
    }



    self.ObjectID       =_article.ObjID;
    self.lblName.text   =_article.Name;
    self.lblAdress.text =_article.Adress;
    strPhone            =_article.Phone;


}

1 个答案:

答案 0 :(得分:0)

更好地熟悉重复使用细胞的概念。

每当一个单元格在表格中可见时,就会调用委托方法cellForRowAtIndexPath。当用户向上和向下滚动时,它会被调用几次,因为您(和用户)认为可能是同一个单元格。

每当一个单元格从屏幕滚动时,它就会被移动到可重复使用的单元格池中。

首先,从重用池中获取一个单元。只有当你没有得到一个(并且取决于你实际如何获取它可能或可能永远不会是这种情况)时,创建一个新的单元实例。

相反,你总是创造一个新的细胞! (如果我没有太多错误,即使使用ARC,你也会在这里留下内存。如果你的单元没有重用ID,你可能不会,因为它不会被移动到重用池。)

一旦牢记了你的细胞,就可以从一个细胞中调用该方法 - 从用户的角度来看 - 可以在之前看到并且可能在其上有选择状态或其他数据。这对您来说意味着:当用户在向上和向下滚动之后将某些内容更改为要恢复的单元格时,或者反之亦然,那么您需要将该状态存储在单元格对象之外的某个位置。您需要分别在cellForRowAtIndexPath中恢复视图。

目前你不做任何事情。