使用UITableView时如何避免重绘效果?

时间:2011-02-10 14:36:39

标签: objective-c uitableview

我最近调试了一个视图控制器的问题并注意到每次我向上或向下拖动视图时它都会重新绘制我的UITableView的全部内容(因为它每次调用cellForRowAtIndexPath方法)。是否可以使用内存数据源或将另一个委托添加到我的视图控制器中,以便每次都不会重新绘制?

当用户与其进行交互时,我不会修改单元格内的任何内容,因此在调用初始“viewDidLoad”后,我的数据源将是静态的。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

  if ([self.hats count] > 0) {
    //do some complex stuff in here that hurts each time we re-draw this ...
  }

    return cell;  
}

提前谢谢

1 个答案:

答案 0 :(得分:1)

所以// complex stuff表示添加UIViews。

我为UIImageView做了一个例子。由于你没有展示复杂的东西,你必须自己采用它。

您的代码如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    if ([self.hats count] > 0) {
        UIImageView *imageView = [[UIImageView....];
        [cell.contentView addSubView:imageView];
        [imageView setImage:foo];
        [imageView release];
    }
    return cell;
}

重构你看起来像这样的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        UIImageView *imageView = [[UIImageView....];
        [cell.contentView addSubView:imageView];
        imageView.tag = 42;
        [imageView release];
    }

    if ([self.hats count] > 0) {
        UIImageView *imageView = [cell viewWithTag:42];
        [imageView setImage:foo];
    }
    return cell;
}

et瞧,您的tableview是响应式的。因为您为每个单元格准确创建一次子视图。当细胞不再使用并进入重复使用区时,子视图将继续存在。

如果您在一个单元格中需要4个图像视图而在另一个单元格中需要8个图像视图,则在创建单元格时添加8个图像视图,并为它们提供一个CGRectZero框架,当然每个视图都有不同的标记。
如果您需要它们,则显示它们,如果您不需要它们,则将图像设置为nil,将帧设置为零。