UI基础5 字典转模型 类前缀 View封装 Xib

字典转模型

使用字典的坏处

  • 一般情况下,设置数据和取出数据都使用“字符串类型的key”,编写这些key时,编辑器没有智能提示,需要手敲
dict[@"name"] = @"Jack";
NSString *name = dict[@"name"];
  • 手敲字符串key,key容易写错
  • Key如果写错了,编译器不会有任何警告和报错,造成设错数据或者取错数据

使用模型的好处

  • 所谓模型,其实就是数据模型,专门用来存放数据的对象,用它来表示数据会更 加专业
  • 模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错,因此,保证了数据的正确性
  • 使用模型访问属性时,编译器会提供一系列的提示,提高编码效率
app.name = @"Jack";
NSString *name = app.name;

模型

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

instancetype

  • instancetype在类型表示上,跟id一样,可以表示任何对象类型
  • instancetype只能用在返回值类型上,不能像id一样用在参数类型上
  • instancetype比id多一个好处:编译器会检测instancetype的真实类型
  • instancetype 只能用在返回值上

字典转模型构造方法

  • 字典转模型的过程最好封装在模型内部

  • 模型应该提供一个可以传入字典参数的构造方法

- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)xxxWithDict:(NSDictionary *)dict;

类前缀

  • 使用Objective-C开发iOS程序时,最好在每个类名前面加一个前缀,用来标识这个类是谁来负责开发的

  • 目的是防止N个人开发了一样的类,冲突了

  • 比如张三、李四在同一个项目中都各自开发了个Button类,这样的程序是 不能运行起来的
    -解决方案:张三的类名叫做ZSButton,李四的类名叫做LSButton

  • 在已建的项目中,在项目中的Class prefix 添加类前缀名,这样在以后新建累的时候会自动添加类前缀

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

  • 宽度高度其实为0
  • 位置不对(超出屏幕)
  • hidden == YES
  • alpha <= 0.01
  • 没有设置背景色、没有设置内容
  • 可能是文字颜色和背景颜色一样

View的封装

  • 如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心

  • 外界可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据

  • 封装控件的基本步骤

    • 在initWithFrame:方法中添加子控件,提供便利构造方法
      , init方法内部会自动调用initWithFrame方法
    • 在layoutSubviews方法中设置子控件的frame(一定要调用super的layoutSubviews)
    • 增加模型属性,在模型属性set方法中设置数据到子控件上

UIButton、UIImageView、UILabel的选择

  • 特点

    • UIButton

      • 既能显示文字,又能显示图片(能显示2张图片,背景图片、内容图片)
      • 长按高亮的时候可以切换图片\文字
      • 直接通过addTarget...方法监听点击
    • UIImageView

      • 能显示图片,不能直接通过addTarget...方法监听点击
    • UILabel

      • 能显示文字,不能直接通过addTarget...方法监听点击
  • 选择

    • 仅仅是显示数据,不需要点击
      建议选择UIImageView、UILabel

    • 不仅显示数据,还需要监听点击

      • 建议选择UIButton
      • 其实UIImageView、UILabel也可以通过手势识别器来监听(后面课程会学)
    • 长按控件后,会改变显示的内容

      • 不用考虑了,选择UIButton(因为UIButton有highlighted这种状态)
    • 同时显示2张图片:背景图片、内容图片

      • 不用考虑了,选择UIButton

Xib

Xib和storyboard对比

  • 共同点:

    • 都用来描述软件界面
    • 都用Interface Builder工具来编辑
    • 本质都是转换成代码去创建控件
  • 不同点

    • Xib是轻量级的,用来描述局部的UI界面
    • Storyboard是重量级的,用来描述整个软件的多个界面,并且能展示多个界面之间的跳转关系

Xib的加载

  • 方法1
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"xib文件名" owner:nil options:nil]
  • 方法2
UINib *nib = [UINib nibWithNibName:@"xib文件名" bundle:nil];
NSArray *views = [nib instantiateWithOwner:nil options:nil];

注意点

  • 一个控件有2种创建方式

    • 通过代码创建

      • 初始化时一定会调用initWithFrame:方法
    • 通过xib\storyboard创建

      • 初始化时不会调用initWithFrame:方法,只会调用initWithCoder:方法
      • 初始化完毕后会调用awakeFromNib方法
  • 有时候希望在控件初始化时做一些初始化操作,比如添加子控件、设置基本属性

    • 这时需要根据控件的创建方式,来选择在initWithFrame:、initWithCoder:、awakeFromNib的哪个方法中操作
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 掌握 UIView的常见属性和方法 九宫格计算方法 字典转模型 Xib的使用 自定义view(view的封装) 简...
    JonesCxy阅读 1,404评论 1 3
  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,494评论 2 4
  • UI Basic Note UIView的常用方法 获取父/子控件@property(nonatomic,read...
    马文涛阅读 1,763评论 3 16
  • 我努力的向你跑去 你羞涩的别过头 向着反方向逃离
    荡的宫阅读 169评论 0 0
  • 仿佛一切都同原来一样 清晨起床就开始闲聊 中午给我送饭 晚上下雨送我回家 你问 我们的分手还算数吗 我不知道该如何...
    子执年华阅读 1,334评论 4 3