UITable的重用问题

UITableViewCell重用

  • 为了能够保证tableViewCell能够高效的执行,Objective-c中引进了重用队列的机制,重影现象也是在重用队列时经常遇到的问题,那么如何解决这个问题呢?下面给出了几种解决办法。

第一种解决方法

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

{
     NSArray *subViews = cell.contentView.subviews;

     for (UIView *view in subViews) {

        [view removeFromSuperview];
    }
}  

以上只是列举了方法实现的位置,并没有将所有代码写出来。上面的实现方法是将cell.contentView上面的子视图全部取出来,把它们一一移除,这是解决问题的一种方法, 如果子视图过多的话,每次重用的时候都会一一把子视图移除会在程序的执行效率上产生问题。

第二种解决办法

  • 我们会这样想,既然全部移除后再一一初始化使用这种办法在执行效率上不是很高,那如果在除了第一次申请内存空间外,其它的情况下,在使用之前先判断当前子视图是否存在,如果存在的话就把上面的内容换掉不就避免了重复申请内存的问题吗
  • - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
      NSDictionary *dicUserInfo = [self.statusList[indexPath.section] objectForKey:@"user"];
      NSDictionary *statusInfo = self.statusList[indexPath.section];
      NSUInteger widthSpace = 5;
      //cell的重用队列
      static NSString *cellIdentifier = @"statusCell";
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
      if (nil == cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        //下面是对微博头部的定义
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 35, 35)];
        imageView.tag = 1000;
        [cell.contentView addSubview:imageView];
        UILabel *labelScreenName = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(imageView.frame)+widthSpace, 2, 100, 20)];
        labelScreenName.font = [UIFont systemFontOfSize:12.0f];
        labelScreenName.tag = 1001;
        [cell.contentView addSubview:labelScreenName];
        UILabel *labelCreateTime = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(imageView.frame)+widthSpace,CGRectGetHeight(labelScreenName.frame)+ 2,150,20)];
        labelCreateTime.font = [UIFont systemFontOfSize:12.0f];
        labelCreateTime.tag = 1002;
        [cell.contentView addSubview:labelCreateTime];
        UILabel *labelSource = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(labelCreateTime.frame)+widthSpace, CGRectGetHeight(labelScreenName.frame)+2, 100, 20)];
        labelSource.tag = 1003;
        labelSource.font = [UIFont systemFontOfSize:12.0f];
        [cell.contentView addSubview:labelSource];
      }
      UIImageView *imgView = (UIImageView*)[cell.contentView viewWithTag:1000];
      NSURL *imgURL = [NSURL URLWithString:[dicUserInfo objectForKey:@"profile_image_url"]];
      [imgView setImageWithURL:imgURL];
      //微博用户名称
      UILabel *screenName = (UILabel*)[cell.contentView viewWithTag:1001];
      screenName.text = [dicUserInfo objectForKey:@"screen_name"];
      //微博创建时间
      UILabel *createTime = (UILabel*)[cell.contentView viewWithTag:1002];
      NSString *strDate = [statusInfo objectForKey:@"created_at"];
      NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
      [dateFormatter setDateFormat:@"EEE MMM dd HH:mm:ss ZZZ yyyy"];
      NSDate *dateFromString = [dateFormatter dateFromString:strDate];
      NSTimeInterval interval = [dateFromString timeIntervalSinceNow];
      createTime.text = [NSString stringWithFormat:@"%d分钟之前",abs((int)interval/60)];
      //微博来源
      UILabel *labelSource =(UILabel*)[cell.contentView viewWithTag:1003];
      NSString *xmlSourceString = [statusInfo objectForKey:@"source"];
      NSDictionary *dicSource = [NSDictionary  dictionaryWithXMLString:xmlSourceString];
      labelSource.text = [dicSource objectForKey:@"__text"];
      return cell;
    }
  • 第二种解决方法是通过微博的代码进行举例的,这个方法是通过给cell.contentView上面的所有子视图添加一个tag,因为tag是视图的唯一标识符,当使用重用队列的时候,只需要通过tag把子视图取出来,通过改变子视图上面的内容来改变显示的内容即可。这个方法的执行效率显然比第一种解决办法要高的多。

第三种解决办法

  • 了解面向对象的人都明白,这里可以采用封装的方式,可以实现同样的作用。其实这种方法和第二种方法差不多,就是新建一个自定义的类来实现上述的功能,如自定义一个cell类,可以把上述功能封装到自定义的类中,使用自定义的类可以也可以实现,但是 自定义的类中一般只对固定不变的类进行封装 。大家有兴趣可以试验一下这个方法。
时间: 2024-11-10 01:06:52

UITable的重用问题的相关文章

Linux代码的重用与强行卸载Linux驱动

(一)Linux代码的重用 重用=静态重用(将要重用的代码放到其他的文件的头文件中声明)+动态重用(使用另外一个Linux驱动中的资源,例如函数.变量.宏等) 1.编译是由多个文件组成的Linux驱动(静态重用) 对于复杂的Linux驱动,需要使用多个源代码文件存放不同的功能代码,这样做有利于代码分类和管理,那么就不得不编译多个源代码文件,最终生成.ko文件或编译进Linux内核 下面,就介绍将3个.c文件分别编译为3个.o文件,并将这3个.o文件链接(link)成一个.ko文件——静态重用 假

ViewPager的Adapter中视图重用

ViewPager的PagerAdapter不像ListView/GridView的BaseAdapter,它是没有内部视图重用机制的,也就是说我先inflate出来一个,然后调用destroyItem后,这个视图就被抛弃了,如果需要更多的视图,则需要再次inflate.如果ViewPager中的所有视图基本相同,就存在内存的浪费了.这里使用一个非常简单的方法实现视图的重用: List<View> mViewList = new ArrayList<View>(); public

iOS中UITableViewCell的重用问题解决方案

UITableViewCell重用 为了能够保证tableViewCell能够高效的执行,Objective-c中引进了重用队列的机制,重影现象也是在重用队列时经常遇到的问题,那么如何解决这个问题呢?下面给出了几种解决办法. 第一种解决方法 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSArray *subViews = cell

如何通过“重用”提高原型设计的工作效率

随着信息时代的发展,各种类型的软件.app.网页井喷似的涌现.每天新上线的产品不计其数.互联网产品飞速的迭代和更新不仅仅对程序员程序施加了很大的压力,对设计师来说,也是巨大的挑战.那么,如何在设计的过程中提高效率? 重用,也就是"反复使用",它从来都是提高效率方法中的典范.在代码编写的过程中,重用是很重要的一部分.这种方法同样可以运用到原型设计的过程中.今天我们就来说一下,原型设计过程中的"重用". 首先,重用有哪些好处? 软件工程师的一个目标就是通过重复使用代码来

LLVM和GCC的区别(LLVM提供了模块化的编译模块,非常有利于重用,以前的编译器都没有做到这一点)

最近在Mac OS X Mountain Lion下用Xcode进行开发,发现在编译选项里有如下所示的这两种编译器:一个是Apple LLVM compiler 4.2,另外一个是LLVM GCC 4.2. 近几年一直听人说LLVM比GCC好,但是我一直没有时间研究这二者的差别.由此问题出发,我又给自己抛出了很多疑问: cc, c89, c99是什么?有何区别? gcc, g++, cpp, gpp又是什么? LLVM与GCC区别大吗? Apple LLVM compiler 4.2和LLVM

UITableViewCell的重用机制原理

UITableViewCell的重用机制原理 来自http://blog.csdn.net/omegayy/article/details/7356823 ========================================================== 创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowA

UITable View 的展开

UITableView分区展开与收起 概述 今天教大家利用UITableView的section实现像QQ那样的展开与收起的效果.其实实现起来是非常简单的,不过还是写一篇文章给大家讲讲思路并给新手参考的源代码. 简单,但是不同的人来实现也许会有不同的实现方式,简单程度也会不一样哦.其实与AppStore中的分类页面中的效果挺像的,不过人家那并不是这种动画效果,而是更美的动画! 文章内容 看完本篇文章,您将会学习到: 如何利用UITableView的section来实现展开与收起的效果 如何复用U

UITableViewCell重用机制

1.UITableViewCell重用机制    1.cell使用重用的原因和重用机制的原理:      原因:     一个UITableView中有许多需要显示的cell,但是我们不可能每个都会浏览到,那么如果我们把这些数据全部都加载进去,是会造成内存的负担的.     我们所能显示的区域通常只有一个屏幕的大小,那么那些屏幕之外的信息是不需要一次性全都加载完的,只有当我们滑动屏幕需要浏览的时候,我们才需要它加载进来.因此,就有了我们要介绍的这部分内容,UITabelViewCell的重用机制

UITableViewCell的重用机制和解决方法

UITableView为了做到显示与数据的分离, 单独使用了一个叫UITableViewCell的视图用来显示每一行的数据, 而tableView得重用机制就是每次只创建屏幕显示区域内的cell,通过重用标识符identifier来标记cell, 当cell要从屏幕外移入屏幕内时, 系统会从重用池内找到相同标识符的cell, 然后拿来显示, 这样本是为了减少过大的内存使用, 但在很多时候, 我们会自定义cell,这时就会出现一些我们不愿意看到的现象, 下面就介绍一些解决这些问题的方法 UITab