Mj视频中有关UITableView知识点的摘取

1.针对自定义UITableViewcell 时,何时使用xib或代码定义一个xib?

       

      当每个cell的结构和布局相同使用 xib封装cell

      反之,使用代码封装xib


  2.1怎样封装cell在xib

    1.新建一个xib文件描述一个view的内部结构(假设叫做MJTgCell.xib)


    2 新建一个自定义的类

     (自定义类需要继承自系统自带的view, 继承自哪个类,  取决于xib根对象的  Class)


    3新建类的类名最好跟xib的文件名保持一致(比如类名就叫做MJTgCell)

      将xib的根对象变为这个类名


    4.将xib中的控件 自定义类的.m文件 进行连线


     5.提供一个类方法返回一个创建好的自定义view(屏蔽从xib加载的过程)


     6.提供一个模型属性让外界传递模型数据


     7.重写模型属性的setter方法,在这里将模型数据展示到对应的子控件上面



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


         1.新建一个继承自UITableViewCell的类


   2.重写initWithStyle:reuseIdentifier:方法

           添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控  

           件要添加到contentView)

           进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体

           \固定的图片)


    3.提供2个模型

            数据模型: 存放文字数据\图片数据

      frame模型: 存放数据模型\所有子控件的frame\cell的高度


    4.cell拥有一个frame模型(不要直接拥有数据模型)


    5.重写frame模型属性的setter方法: 在这个方法中设置子控件的显示 

             数据和frame


    6.frame模型数据的初始化已经采取懒加载的方式(每一个cell对应的frame模型数

              据只加载一次)


   3.Cell的重用原理

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


      重用原理:当滚动列表时,部分UITableViewCell会移出窗口,  

              UITableView会将窗口外的UITableViewCell放入一个对象池中,等待

              重用。当UITableView要求dataSource返回UITableViewCell时,

              dataSource会先查看这个对象池,如果池中有未使用的

              UITableViewCelldataSource会用新的数据配置这个

              UITableViewCell,然后返回给UITableView,重新显示到窗口中,从

               而避免创建新对象

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


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

    - (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;

}



   4.MVC


       MVC是一种设计思想,贯穿于整个iOS开发中,需要积累一定的项目经验,才能深刻体会其中的含义和好处


   MVC中的三个角色

     MModel,模型数据

     VView,视图(界面)

     CControl,控制中心


   MVC的几个明显的特征和体现:

    View上面显示什么东西,取决于Model

         只要Model数据改了,View的显示状态会跟着更改

    Control负责初始化Model,并将Model传递给View去解析展示


         注意:view中代码不会出现controller类名,当如果view要调用controller中类,可以使       

                     用 代理模式;


     5.代理的使用步骤

    

            对象A内部发生了一些事情,想通知对象B


        对象B想监听对象A内部发生了什么事情


         对象A想在自己的方法内部调用对象B的某个方法,并且对象A不能对对象B有耦合依赖


        对象A想传递数据给对象B



        以上情况,结果都一样:对象B对象A的代理(delegate)

       先搞清楚谁是谁的代理(delegate)


     定义代理协议,协议名称的命名规范:控件类名 + Delegate


         定义代理方法

       代理方法一般都定义为@optional

       代理方法名都以控件名开头

       代理方法至少有1个参数,将控件本身传递出去

      


 

      设置代理(delegate)对象  (比如myView.delegate = xxxx;)

        代理对象遵守协议

        代理对象实现协议里面该实现的方法

     

       在恰当的时刻调用代理对象(delegate)的代理方法,通知代理发生了什  么事情

      (在调用之前判断代理是否实现了该代理方法)



             为了避免代理方法不存在而调用了会出现错误 通常都是以下这样做得:

                       // 通知代理

        if ([self.delegate respondsToSelector:@selector(tgFooterViewDidClickedLoadBtn:)]) {

            [self.delegate tgFooterViewDidClickedLoadBtn:self];

        }

                 /**

 *  点击"加载"按钮

 */

- (IBAction)loadBtnClick {

    // 1.隐藏加载按钮

    self.loadBtn.hidden = YES;

    

    // 2.显示"正在加载"

    self.loadingView.hidden = NO;

    

    // 3.显示更多的数据

    // GCD

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 3.0s后执行block里面的代码

        

        

        // 4.显示加载按钮

        self.loadBtn.hidden = NO;

        

        // 5.隐藏"正在加载"

        self.loadingView.hidden = YES;

    });

}

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值