UITableView性能优化及使用总结

来源:互联网 发布:dota2台词 知乎 编辑:程序博客网 时间:2024/06/06 18:29

--------UITableView

1.UITableView基本介绍

        在iOS中,要实现表格数据展示,最常用的做法就是使用UITableViewUITableView继承于UIScrollView,这样的继承关系使得表视图可以实现上、下滚动。

      UITableview有分组和不分组两种样式,可以在storyboard或者是用代码设置。

   /*设置表视图的样式:

    UITableViewStylePlain 平铺

    UITableViewStyleGrouped 分组

   */


2.UITableview数据展示

        数据源方法(UITableviewDataSource):实例化表视图时,必须要实现它的数据源方法,以此来完成表中数据的配置(一般来说数据源方法是用来配置表中的数据)

        委托方法(UITableviewDelegate):表视图的委托方法(代理方法),一般是处理表视图基本样式(单元格的高度)以及捕捉选中单元格选中事件等

        展示数据的过程:

              (1)调用数据源的下面⽅法得知⼀一共有多少组数据
            - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

              (2)调用数据源的下面⽅法得知每一组有多少行数据
            - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

              (3)调⽤数据源的下⾯⽅法得知每⼀⾏显示什么内容

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

3.UITableViewCell的性能问题和cell的重用代码演示

         存在问题:cell的工作 ——在程序执行的时候,能看到多少条,它就创建多少条数据,如果视图滚动那么再创建新显示的内容。(系统自动调用)。即当一个cell出现在视野范围内的时候,就会调用创建一个cell。这样的逻辑看上去没有什么问题,但是真的没有任何问题吗?

   当创建调用的时候,我们使用nslog打印消息,并打印创建的cell的地址。我们发现如果数据量非常大,用户在短时间内来回滚动的话,那么会创建大量的cell,一直开辟空间,且如果是往回滚,通过打印地址,我们会发现它并没有重用之前已经创建的cell,而是重新创建,开辟新的存储空间。

解决方法:cell的重用

1 iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象

2)重⽤原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回 UITableViewCell,dataSource会先查看这个对象池,如果池中有未使用的 UITableViewCell,dataSource则会用新的数据来配置这个UITableViewCell,然后返回给 UITableView,重新显示到窗口中,从而避免创建新对象。这样可以让创建的cell的数量维持在很低的水平,如果一个窗口中只能显示5cell,那么cell重用之后,只需要创建6cell就够了。

3)注意点:还有⼀个非常重要的问题:有时候需要自定义UITableViewCell(用⼀个子类继UITableViewCell),而且每⼀行⽤的不一定是同一种UITableViewCell,所以一UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多类型的 UITableViewCell,那么UITableView在重⽤用UITableViewCell时可能会得到错误类型的 UITableViewCell

解决方法:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell,通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标来初始化⼀一个UITableViewCell对象。

cell的重用代码演示:



    注意:1autorelease放的地方要注意:确保alloc对应一个autorelease,在括号里面写

        2、为了确保数据的实时性,数据的赋值应该在括号外面

        3、在添加子视图的时候,为了确保视图只被加一次,需要在括号里面写




     UITableViewCell的类型:

     UITableViewCellStyleDefault:系统会提供两个子视图给我们,一个是textLabel,还有一个可选的imageView,左侧显     示imageView,右侧显示textLabel

     UITableViewCellStyleValue1:系统会提供三个视图给我们,两个Label,分别是textLabeldetailTextLabeltextLabel显示在左侧,detailTextLabel显示在右侧,那么如果imageView要显示,则它会显示在最左侧

     UITableViewCellStyleValue2:不可以显示imageView

     UITableViewCellStyleSubtitleimageView会显示在最左侧,右侧显示两个Label,上下显示(最常用的)

cell的一些属性:

1)设置cell的辅助视图,设置cell.accessoryView(系统提供了枚举型,也可以自定义@父类指针指向子类对象);

2)设置cell的背景颜色,有两种方式可以设置cell的背景颜色: 

通过backgroundColor backgroundView都可以设置cell的背景。但是backgroundView的优先级比 backgroundColor的高,所以如果同时设置了backgroundColorbackgroundView,那么backgroundView会盖住backgroundColor

   示例:cell.backgroundColor = [UIColor blueColor];

3)设置cell默认状态的背景

  示例1

      UIView *view = [[UIView alloc] init];

      view.backgroundColor = [UIColor blueColor];

      cell.backgroundView = view;

  示例2

    UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"buttondelete"]];

    cell.backgroundView = iv;(父类指针指向子类对象,可以使用图片用简单的操作设置绚丽的效果)

4)设置cell选中状态的背景

示例:

  UIView *view2 = [[UIView alloc] init];

    view2.backgroundColor = [UIColor purpleColor];

    cell.selectedBackgroundView = view2;



0 0