• 关于talbeViewCell一点感想


    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     
        NSString *aCellID = @"aCellID";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:aCellID];
     
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:aCellID];
        }
     
        cell.textLabel.text = [NSString stringWithFormat:@"这是第%tu行", indexPath.row];
        return cell;
    }
    上述的代码非常常见,先定义一个cell的重用标识,然后再从table的池子里根据这个标识去取cell便于重用,如果没有取到cell就创建某种样式这种标识的cell,然后再分发数据给cell。
     
     
    一、为什么要设定一个标识,为了cell的复用。如果某些情况下不想重用,那么就没必要创建这个标识,但是不创建标示我们创建cell的时候就只有一个initWithStyle,写个样式,然后加个标识;这样每次来取cell的时候就是直接拿,不用再去池子里取了。假如你的table里就展示三个cell完全适用,也没必要千篇一律地写上面那些代码,为什么写,难道每次都复用,或者我们根本不思考一些问题,直接那样写,我想我不应该是那样的人,也行是闲得蛋疼,有些人总会找些事来做,比如说我,并深知其中快乐。
        
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     
         NSString *aCellID = @"aCellID";
         TableViewCellw *cell  = [[TableViewCellw alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:aCellID];
     
        cell.textLabel.text = [NSString stringWithFormat:@"这是第%tu行", indexPath.row];
        return cell;
    }

    既然已经不重用cell了,那么系统也不会再去池子里取了,进而这个标识也没用了,直接置空吧,这样写起代码来更简洁
        
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     
         TableViewCellw *cell  = [[TableViewCellw alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
     
        cell.textLabel.text = [NSString stringWithFormat:@"这是第%tu行", indexPath.row];
        return cell;
    }
    这样没从池子里取而是直接创建cell不管你有没有设置重用标识,它都会在自身整个视图超出table时 dealloc。如果是从池子里取的,则出table时会被放到了池子里进行缓存等待下次重用。
     
     
    有些时候,可能我们只是需要UITableViewCellStyleDefault这种样式的cell,那么在这种情况下我们的代码还可以写成这样
        
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     
         TableViewCellw *cell  = [[TableViewCellw alloc] init];
     
        cell.textLabel.text = [NSString stringWithFormat:@"这是第%tu行", indexPath.row];
        return cell;
    }

    当然如果要你不是用的系统默认的样式,则又要把style这个init写出来,这样才能获取需求的样式
        
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     
         TableViewCellw *cell  = [[TableViewCellw alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:nil];
     
        cell.textLabel.text = [NSString stringWithFormat:@"这是第%tu行", indexPath.row];
        return cell;
    }
    需要注意的是上面的做法只适合于不需要重用的情况。一个talbe就用三四个cell展示一点数据,完全没必要写那些重用的代码。
    就像公司到底是用纯代码,xib加代码还storyboard加代码来开发一样,根据需求怎样简单怎样选择开发方式。
    有些公司一直坚持用纯代码开发,总是觉得有xib有storyboard,总觉得他们是xml格式的,到时运行或者其他什么的转化需要时间,可能会影响到性能。
     
    其实经过编译然后链接再运行的时候,或者你解包一个app就能看到一些文件,或者你也像我一样学过汇编,知道到最底层的时候都是01串了,苹果打包时,已经把它们弄成01串了。就算真的影响性能,苹果这个这么注重性能优化的公司会允许我们大用xib,storyboard吗。
     
    之前见一哥们的公司就用stroryboard开发,而且到了跟iOS开发中比单例还滥用的几百倍的感觉,猛地打开storyboard卡地我电脑,还以为pro不给力了,结果打开才发现好几百个控制器在里面,线飞来飞去地,整个银河系统星云尘埃联运的感觉……
     
    二、为什么要从池子里取,这是table的默认的重用机制,里面放着某种标识的cell,等待提取等待复用,之前尝试让table不重用,无奈技术不到位。
     
     
    三、为什么要判断cell为空,cell为空也就是没从池子里取到这种标识的cell。
     
    不是每次cell都可能为空,比如你在storyboard里有cell并且设定了标识,那么就没必要判断为空的情况了,因为当系统从池子里取时,会有个从storyboard或者是xib里查找这种标识的cell的过程,所以当你非常确定时,就直接从池子里取吧。
     
    应该是先看看storyboard中有没有这种标识的cell,所以如果你在storyboard中有了这个标识的cell,那么就不用判断为空了,直接系统每次就能在空的情况下在storyboard在拿到一个。所以后面见有些大神的代码更精简了,不过现在好多公司都是xib加代码。
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     
        // 注意这里的标识要跟storyboard或者xib里cell的标识要一样
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"aCellID"];
     
        cell.textLabel.text = [NSString stringWithFormat:@"这是第%tu行", indexPath.row];
        return cell;
    }

    说到到底,一开始就是由于cell个数少不想重用,不想写那些常规代码进而对常规代码进行了精简,

    其实如果这些为数不多的cell如果在项目中功能需求不复杂的话,完全可以使用静态单元格来实现。

    这样在控制器的代码也更简单了,不用写那三个写得快吐了的代理方法了,系统直接从storyboard中取。

    修改静态单元格中的数据也简单

  • 相关阅读:
    让所有IE支持HTML5的解决方案
    分享按钮源码
    jQuery引用
    字体 ttf 下载
    重写 gallery 防止滚过头
    view 隐藏 显示
    android 数据存储几个方式
    TextView 内容居中
    eclipse导入基类方法
    imageview 全屏 拖动
  • 原文地址:https://www.cnblogs.com/songxing10000/p/4590500.html
Copyright © 2020-2023  润新知