精华内容
下载资源
问答
  • UITableView

    2016-01-11 10:35:02
    UITableView

                                             UITableView(简介)


    UITableView 两种模式

    UITableViewStylePlain                   



     UITableViewStyleGrouped


    如何展示数据

    • UITableView需要一个数据源(dataSource)来显示数据
    • 凡是遵守UITableViewDataSource协议的OC对象,都可以是UITableView的数据源
    // 一共有多少组数据
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
    // 每一组有多少行数据
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
    // 每一行显示什么内容
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
    


    UITableViewCell的contentView

    • contentView下默认有3个子视图
    • 其中2个是UILabel(通过UITableViewCell的textLabeldetailTextLabel属性访问)
    • 第3个是UIImageView(通过UITableViewCell的imageView属性访问)
    • UITableViewCell还有一个UITableViewCellStyle属性,用于决定使用contentView的哪些子视图,以及这些子视图在contentView中的位置


    Cell的重用原理

    • iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象
    • 重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 1.定义一个cell的标识
          static NSString *ID = @"mjcell";
        
        // 2.从缓存池中取出cell
          UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
        
        // 3.如果缓存池中没有cell
          if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
        }
        
        // 4.设置cell的属性...
        
          return cell;
    }

    使用xib封装一个view的步骤


    通过代码自定义cell(cell的高度不一致)



    代理

    UITableView代理方法有很多,例如监听单元格显示周期、监听单元格选择编辑操作、设置是否高亮显示单元格、设置行高等。








    展开全文
  • UITableview

    2015-10-30 15:53:42
    在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信、QQ、新浪微博等软件基本上随处都是UITableView。当然它的广泛使用自然离不开它强大的功能,今天这篇...


    在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信、QQ、新浪微博等软件基本上随处都是UITableView。当然它的广泛使用自然离不开它强大的功能,今天这篇文章将针对UITableView展开讨论。

    基本介绍

    UITableView有两种风格:UITableViewStylePlain和UITableViewStyleGrouped。这两者操作起来其实并没有本质区别,只是后者按分组样式显示前者按照普通样式显示而已。在UITableView中数据只有行的概念,并没有列的概念,因为在手机操作系统中显示多列是不利于操作的。UITableView中每行数据都是一个UITableViewCell,在这个控件中为了显示更多的信息,iOS已经在其内部设置好了多个子控件以供开发者使用。如果我们查看UITableViewCell的声明文件可以发现在内部有一个UIView控件(contentView,作为其他元素的父控件)、两个UILable控件(textLabel、detailTextLabel)、一个UIImage控件(imageView),分别用于容器、显示内容、详情和图片。

    当然,这些子控件并不一定要全部使用,具体操作时可以通过UITableViewCellStyle进行设置,具体每个枚举表示的意思已经在代码中进行了注释:

    typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
        UITableViewCellStyleDefault,    // 左侧显示textLabel(不显示detailTextLabel),imageView可选(显示在最左边)
        UITableViewCellStyleValue1,        // 左侧显示textLabel、右侧显示detailTextLabel(默认蓝色),imageView可选(显示在最左边)
        UITableViewCellStyleValue2,        // 左侧依次显示textLabel(默认蓝色)和detailTextLabel,imageView可选(显示在最左边)
        UITableViewCellStyleSubtitle    // 左上方显示textLabel,左下方显示detailTextLabel(默认灰色),imageView可选(显示在最左边)
    };
    数据源

    由于iOS是遵循MVC模式设计的,很多操作都是通过代理和外界沟通的,但对于数据源控件除了代理还有一个数据源属性,通过它和外界进行数据交互。 对于UITableView设置完dataSource后需要实现UITableViewDataSource协议,在这个协议中定义了多种 数据操作方法。

    #pragma mark - 数据源方法
    #pragma mark 返回分组数
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
    
     #pragma mark 返回每组行数
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
    
    #pragma mark返回每行的单元格
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
      
    #pragma mark 返回每组头标题名称
    -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
    
    #pragma mark 返回每组尾部说明
    -(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
    

    代理

    #pragma mark - 代理方法
    #pragma mark 设置分组标题内容高度
    -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
     
    #pragma mark 设置每行高度(每行高度可以不一样)
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
    
    #pragma mark 设置尾部说明内容高度
    -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
    
    
    性能优化

    UITableView中的单元格cell是在显示到用户可视区域后创建的,那么如果用户往下滚动就会继续创建显示在屏幕上的单元格,如果用户向上滚动返回到查看过的内容时同样会重新创建之前已经创建过的单元格。如此一来即使UITableView的内容不是太多,如果用户反复的上下滚动,内存也会瞬间飙升,更何况很多时候UITableView的内容是很多的。在UITableView内部有一个缓存池,初始化时使用initWithStyle:(UITableViewCellStyle) reuseIdentifier:(NSString *)方法指定一个可重用标识,就可以将这个cell放到缓存池。然后在使用时使用指定的标识去缓存池中取得对应的cell然后修改cell内容即可。

    #pragma mark返回每行的单元格
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        //NSIndexPath是一个对象,记录了组和行信息
        NSLog(@"生成单元格(组:%i,行%i)",indexPath.section,indexPath.row);
       
        //由于此方法调用十分频繁,cell的标示声明成静态变量有利于性能优化
        static NSString *cellIdentifier=@"ID";
        //首先根据标识去缓存池取
        UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        //如果缓存池没有到则重新创建并放到缓存池中
        if(!cell){
            cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
        }
        //设置cell的数据
    
         return cell;
    }





    
    

    展开全文
  • uitableview

    2014-08-14 10:24:52
    1.uitableview 实现每次滚屏时只滚一个cell的高度 可以设置uitableview的pagingEnabled属性wei
    1.uitableview 实现每次滚屏时只滚一个cell的高度
    

    可以设置uitableview的pagingEnabled属性为yes这样就有了uiscroller滚动停顿的效果


    2.设置定位到某个cell可以这样

     NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:3 inSection:0];

    [_photoTableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];


    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,090
精华内容 8,036
关键字:

uitableview