优化tableView滚动

时间:2012-08-03 12:43:37

标签: iphone uitableview

如果额外填充,我的tableView会滚动延迟。最多20个单元格顺利,但在上面 - 它在滚动时开始滞后。请建议一个具有更好滚动结果的实现。这是我做的方式:

我已经定义了一个自定义UITableViewCell类。

单元格有4个标签和imageView(每个出口都是合成属性): enter image description here

我在tableView中放置了viewController,并按照以下方式填充:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"CustomCell";

    MyCustomCell *cell = (MyCustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell" owner:self options:nil];
        for (id currentObject in topLevelObjects)
            if ([currentObject isKindOfClass:[UITableViewCell class]]){
                cell =  (MyCustomCell *) currentObject;
                break;
            }
    }
    [cell.label_descr setText:@"bla-bla-bla"];
    [cell.label_date setText:@"bla-bla-bla"];
    [cell.label_time setText:@"bla-bla-bla"];
    [cell.label_numeric setText:@"bla-bla-bla"];
    [cell.image_view setImage:[UIImage imageWithContentsOfFile:@"bla-bla-bla"]];

    return cell;
}

正如您所见,每个单元格中的文本数量很难看,而UIImageView使用的图像大约是25x25 .png文件。

我的tableView应该容纳超过300个单元格(不要责怪我,我有一个“来自地狱的客户”)。

请建议一种方法,使tableView滚动更顺畅,没有(很多)滞后。或者另一种方法是向我的“来自地狱”的顾客展示那些“该死的超过300个细胞”。

300提前感谢!

P.S。:抱歉,如果重复,但找​​到的解决方案根本没有帮助。

修改

关于用于imageView的图像:

我只使用2张不同的图片:

  1. “复选标记” - 已完成交易
  2. 和“待处理” - 正在处理的交易
  3. 也许我用来在tableViewCell xib中定义2个imageView出口,只选择所需的imageView,而不是每次都设置所需的图像?

    解决方案,感谢所有人,尤其是iNoob和max _。

    1. 在tableViewCell的xib中,我将“checkMark”设置为imageView的默认图像。
    2. cellForRowAtIndexPath中定义单元格的值时,仅在需要时,我说:

      if_I_should_present_a_pending_image:

         [cell setPending];
      
    3. 将“checkMark”替换为“pending”图像(tableViewCell类中定义的方法):

      - (void)setPending{
          self.image_view.animationImages = [NSArray arrayWithObjects:    
                                          [UIImage imageNamed:@"pending_1.png"],
                                          [UIImage imageNamed:@"pending_2.png"],
                                          [UIImage imageNamed:@"pending_3.png"],
                                          [UIImage imageNamed:@"pending_4.png"],
                                          nil];
          self.image_view.animationDuration = 2.0;
          self.image_view.animationRepeatCount = 0;
          [self.image_view startAnimating];
      }
      

      1

      之后,桌子像魅力一样滚动。再次感谢大家。欢呼声。

3 个答案:

答案 0 :(得分:1)

  1. 不要遍历所有子视图:cell = [topLevelObjects objectAtIndex:0];
  2. 使用gcd在后台加载图像,并将它们存储在NSDictionary中以便于访问:
  3. 伪代码:

    If caches dict contains an object for the URL you want to load
        Retrieve that image from the dict
        Set it as the image
    Else
        Load the image using dispatch_async()
        Add it to the dict
    

答案 1 :(得分:0)

我发现这个article表明以编程方式而不是使用nib文件创建单元格可能会快5到10%。我不知道这是不是真的,所以请耐心等待,但值得一试。

答案 2 :(得分:0)

用以下代码替换您的代码然后尝试一下。

以下代码:

1)在您的控制器中获取UITableViewCell的IBOutlet。对于以下代码,它是myCustomTableViewCell

 MyCustomCell *customCell = (MyCustomCell *)[tableView dequeueReusableCellWithIdentifier:@"MyCustomCell"];
 if(customCell == nil) {
     [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell" owner:self options:nil];
     customCell = myCustomTableViewCell;
  }

希望它能奏效。