02.九宫格 封装 懒加载 plist 模型

九宫格计算思路

  • 利用控件的索引index计算出控件所在的行号和列号
  • 利用列号计算控件的x值
  • 利用行号计算控件的y值

HUD

  • 其他说法:指示器、遮盖、蒙板
  • 半透明HUD的做法
    • 背景色设置为半透明颜色
  • 隐藏HUD的做法
    • 设置其透明度 alpha
    • 设置其隐藏和现实 hidden

定时任务

  • 方法1:performSelector
// 1.5s后自动调用self的hideHUD方法
[self performSelector:@selector(hideHUD) withObject:nil afterDelay:1.5];
  • 方法2:GCD
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // 1.5s后自动执行这个block里面的代码
    self.hud.alpha = 0.0;
});
  • 方法3:NSTimer
// 1.5s后自动调用self的hideHUD方法
[NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(hideHUD) userInfo:nil repeats:NO];
// repeats如果为YES,意味着每隔1.5s都会调用一次self的hidHUD方法

Plist文件

  • 什么是Plist文件

    • 直接将数据直接写在代码里面,不是一种合理的做法。如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低,因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据。如果要变动数据,直接修改数据文件即可,不用修改代码,一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种“属性列表文件”的扩展名是plist,因此也称为“plist文件”
  • Plist文件的使用

    • 获得Plist文件的全路径
      //[NSBundle mainBundle]是主资源包 .Bundle是资源包
      //一个NSBundle对象对应一个资源包(图片、音频、视频、plis等文件)
      //NSBundle的作用:用来访问与之对应的资源包内部的文件,可以用来获得文件的全路径
      //项目中添加的资源都会被添加到主资源包中
      //[NSBundle mainBundle]关联的就是项目的主资源包
      NSBundle *bundle = [NSBundle mainBundle];
      NSString *path = [bundle pathForResource:@"shops" ofType:@"plist"];
      //-resourcePath 获取路径
      NSString *path = [NSBundle pathForResource:@"shops.plist" ofType:nil inDirectory:[[NSBundle mainBundle] resourcePath]];
      
    • 加载plist文件
      _shops = [NSArray arrayWithContentsOfFile:path];
      

常见问题

  • 项目里面的某个.m文件无法使用
    • 检查:Build Phases -> Compile Sources
  • 项目里面的某个资源文件(比如plist、音频等)无法使用
    • 检查:Build Phases -> Copy Bundle Resources

模型

  • 什么是模型?
    • 专门用来存放数据的对象
    • 一般都是一些直接继承自NSObject的纯对象
    • 内部会提供一些属性来存放数据

用模型取代字典的好处

  • 使用字典的坏处
    • 一般情况下,设置数据和取出数据都使用“字符串类型的key”,编写这些key时,编辑器没有智能提示,需要手敲
    • 敲字符串key,key容易写错
    • Key如果写错了,编译器不会有任何警告和报错,造成设错数据或者取错数据
  • 使用模型的好处
    • 所谓模型,其实就是数据模型,专门用来存放数据的对象,用它来表示数据会更加专业
    • 模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错,因此,保证了数据的正确性
    • 使用模型访问属性时,编译器会提供一系列的提示,提高编码效率
      dict[@"name"] = @"Jack";
      NSString *name = dict[@"name"];
      /////////////////////////////
      app.name = @"Jack";
      NSString *name = app.name;
      

view的封装

  • 如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心
  • 外界可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据
  • 封装控件的基本步骤

    • 在initWithFrame:方法中添加子控件,提供便利构造方法(类方法),因为调用init方法会自动调用initWithFrame方法,或者使用懒加载来创建添加子控件

    • 在layoutSubviews方法中设置子控件的frame(一定要调用super的layoutSubviews)

    • 增加模型属性,在模型属性set方法中设置数据到子控件上

一个控件看不见有哪些可能?

  • 宽度或者高度其实为0
  • 位置不对(比如是个负数或者超大的数,已经超出屏幕)
  • hidden == YES
  • alpha <= 0.01
  • 没有设置背景色、没有设置内容
  • 可能是文字颜色和背景色一样

results matching ""

    No results matching ""