0

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

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

它如何在不重新加载的情况下保持单元格?有没有像java“适配器/视图持有者”这样的方法?

谢谢你们。

主要课程:

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

}

**

自定义单元类:

**

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


}
4

1 回答 1

0

更好地熟悉重用单元的概念。

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

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

所以首先,从重用池中获取一个单元格。仅当您没有得到一个(并且取决于您实际获取它的方式可能会或可能永远不会出现这种情况)时,才会创建您的单元格的新实例。

相反,您总是创建一个新单元格!(如果我没记错的话,即使使用 ARC,您也会在这里消耗内存。如果您的单元格没有重用 ID,您可能不会,因为这样它就不会移动到重用池中。)

一旦您牢记单元格裸露,该方法可能会为一个单元格调用,该单元格 - 从用户的角度来看 - 较早可见,并且可能具有选择状态或其他数据。这对您来说意味着:当用户将某些内容更改为您想要在向上和向下滚动后恢复的单元格时,反之亦然,那么您需要将该状态存储在单元格对象之外的某个位置。并且您需要分别在cellForRowAtIndexPath.

目前你没有做任何类似的事情。

于 2013-06-25T08:55:15.123 回答