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;
}
答案 0 :(得分:0)
更好地熟悉重复使用细胞的概念。
每当一个单元格在表格中可见时,就会调用委托方法cellForRowAtIndexPath
。当用户向上和向下滚动时,它会被调用几次,因为您(和用户)认为可能是同一个单元格。
每当一个单元格从屏幕滚动时,它就会被移动到可重复使用的单元格池中。
首先,从重用池中获取一个单元。只有当你没有得到一个(并且取决于你实际如何获取它可能或可能永远不会是这种情况)时,创建一个新的单元实例。
相反,你总是创造一个新的细胞! (如果我没有太多错误,即使使用ARC,你也会在这里留下内存。如果你的单元没有重用ID,你可能不会,因为它不会被移动到重用池。)
一旦牢记了你的细胞,就可以从一个细胞中调用该方法 - 从用户的角度来看 - 可以在之前看到并且可能在其上有选择状态或其他数据。这对您来说意味着:当用户在向上和向下滚动之后将某些内容更改为要恢复的单元格时,或者反之亦然,那么您需要将该状态存储在单元格对象之外的某个位置。您需要分别在cellForRowAtIndexPath
中恢复视图。
目前你不做任何事情。