我有一个TableView。我的问题是为什么UITableViewCell
的任何更改都会在下次加载时保留?
例如,如果我在某些UITableViewCell
中隐藏某些视图,则对于UITableViewCell
的下一次加载,此视图仍然在"隐藏"状态:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellID = @"SendID";
MessagesTableViewCell *cell = (MessagesTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
cell.myIcon.hidden = YES;
}
另一个例子是将加载器添加到我的单元格的视图中,它也是为所有下一个单元格创建的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellID = @"SendID";
MessagesTableViewCell *cell = (MessagesTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
MBProgressHUD *hud;
hud = [MBProgressHUD showHUDAddedTo:cell.imageView animated:YES];
hud.mode = MBProgressHUDModeIndeterminate;
hud.labelText = @"Loading";
}
有没有办法打破这种加载细胞的烦人方式?我需要为UITableViewCell
的下一个负载设置新单元格,而不会出现性能问题(即内存使用率很高)。
答案 0 :(得分:0)
cellForRowAtIndexPath
方法被称为x次,其中x是表视图中的行数或单元格数。因此,对于每个单元格,该方法被调用一次。而你正在做的是隐藏图标或在每次调用中直接添加加载程序,这使得它更改表视图中的每个单元格。如果您希望它为特定单元格执行,请提供条件以检查它是否是所需的单元格。例如,如果要仅为索引1处的单元格隐藏图标,请提供
if(indexPath.row == 1) {
cell. myIcon.hidden == YES;
} else {
cell. myIcon.hidden == NO;
}
答案 1 :(得分:0)
您应该覆盖prepareForReuse
的{{1}}方法并将所有内容重置为默认值。每次细胞出列时都会调用此方法。只需在此设置您的代码,使您的内容清晰,就可以了。
答案 2 :(得分:0)
是的,你可以为每一行提供新的单元格,但这不会得到很好的优化。但是有一种方法可以有效地实现所需的一切。
我认为,最好清除一些事情
只是简短的概述,所以你得到答案
UITableview经过高度优化,因此只在内存中保留屏幕上可见的行。现在,所有行单元格都缓存在池中并被重用而不是重新生成。每当用户滚动UITableview时,它会在Pool中添加刚刚隐藏的行,并重新使用它们作为可见行。
现在,您正在运行时更新单元格UI,因此更新后的视图将被缓存以供重用。
现在,最好的方法是将UITableViewCell的多个实例用于不同类型的UI。
例如,您希望在单元格中加载加载器,然后添加另一个具有不同标识符的UITableViewCell,并将其用于需要加载的单元格。
实施例
if(loadedNeeded)
{
MessagesTableViewCell *cell = (MessagesTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:@"loadedCell" forIndexPath:indexPath];
/*Add Loader programatically or add it in storyboard*/
return cell;
}
else
{
MessagesTableViewCell *cell = (MessagesTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:@"plainCell" forIndexPath:indexPath];
return cell;
}
现在上面的代码将在池中保留两种类型的视图,一种具有标识符" loaderCell"和其他" plainCell"
你将获得所需的输出。
但如果你想采用未经优化的方式,
然后不要使用UITableView的dequeueReusableCellWithIdentifier方法并从nib添加你的单元格或以编程方式启动它,但不是推荐的