UITableViewCell的任何更改都会保留用于下次加载

时间:2016-02-21 09:32:13

标签: ios objective-c uitableview mbprogresshud

我有一个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的下一个负载设置新单元格,而不会出现性能问题(即内存使用率很高)。

3 个答案:

答案 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添加你的单元格或以编程方式启动它,但不是推荐的