Plist文件、HUD、字典转模型、纯代码封装View、XIB封装View

一、Plist文件
属性列表文件,是一个xml文档
1.能直接存储数据类型:Dictionary、Array、Boolean、Data、Date、Number、String
2.其他类型要存储,必须先进行转化再存储,比如如果把UIView对象存入数组再存入Plist文件,虽然不报错,但是是错误的。
3.NSBundle
(1).一个NSBundle对象对应一个资源包(图片、音频、视频、plist等文件)
(2).NSBundle的作用:用来访问与之对应的资源包内部的文件,可以用来获得文件的全路径
(3).项目中添加的资源都会被添加到主资源包中
(4).[NSBundle mainBundle]关联的就是项目的主资源包
4.Plist文件的解析

----------方式一

  NSBundle *bundle = [NSBundle mainBundle];
  //获取Plist在资源包里的全路径
  NSString *path = [bundle pathForResource:@"Property List" ofType:@"plist"];
  //凡是参数名为File,传递的都是文件的全路径
  NSArray *arr = [NSArray arrayWithContentsOfFile:path];
  NSLog(@"%@",arr);

----------方式二

  NSBundle *bundle = [NSBundle mainBundle];
  NSString *path = [bundle pathForResource:@"Property List.plist" ofType:nil];
  NSArray *arr = [NSArray arrayWithContentsOfFile:path];
  NSLog(@"%@",arr);

二、HUD
1.其他说法:指示器、遮盖、蒙板
2.作用:用于显示提示信息
3.半透明HUD的做法:背景色设置为半透明颜色
4.定时任务

//方法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方法;repeats如果为YES,意味着每隔1.5s都会调用一次self的hidHUD方法
[NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(hideHUD) userInfo:nil repeats:NO];

三、字典转模型
1.字典设置数据和取出数据都使用“字符串类型的key”,编写这些key时,编辑器没有智能提示,手敲字符串key,key容易写错,如果Key写错了,编译器不会有任何警告和报错,排错困难。
2.模型其实就是数据模型,专门用来存放数据的对象,用它来表示数据会更加专业;模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错,保证了数据的正确性;使用模型访问属性时,编译器会提供一系列的提示,提高编码效率。
3.设计模型时,属性名一般于各个KEY名一致,提高阅读性。
4.代码举例

字典

----------模型的.h文件

#import <Foundation/Foundation.h>

@interface SSData : NSObject
/** 图片*/
@property (nonatomic,strong) NSString *icon;
/** 文字*/
@property (nonatomic,strong) NSString *name;

+ (instancetype)ssdataWithIcon:(NSString *)icon name:(NSString *)name;

- (instancetype)initWithIcon:(NSString *)icon name:(NSString *)name;
@end

----------模型的.m文件

#import "SSData.h"

@implementation SSData

+ (instancetype)ssdataWithIcon:(NSString *)icon name:(NSString *)name {
  return [[self alloc] initWithIcon:icon name:name];
}

- (instancetype)initWithIcon:(NSString *)icon name:(NSString *)name {
  //字典转模型的过程最好封装在模型内部
  if (self = [super init]) {
    _icon = icon;
    _name = name;
  }
  return self;
}

@end

四、纯代码封装View
1.如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心
2.外界可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据
3.封装控件的基本步骤
(1).在initWithFrame:方法中添加子控件,提供便利构造方法;调用init方法时,系统会自动调用initWithFrame:方法;一般不通过重写init方法来创建子控件。
(2).在layoutSubviews方法中设置子控件的frame(一定要调用super的layoutSubviews);对象本身的Frame发生变化,就会调用layoutSubviews方法。注意:不能在init方法中设置子控件的Frame,因为父控件的Frame初始为0,子控件调用了为0的Frame就会看不见子控件。
(3).增加模型的属性,重写模型属性set方法,在set方法中给内部的子控件设置对应的数据
4.举例子

----------封装View的.h文件

#import <UIKit/UIKit.h>

@class SSData;

@interface SSShowView : UIView
/** 商品模型,用于接收商品的信息,给子控件赋值*/
@property (nonatomic,strong) SSData *showData;
//构造工厂方法
+ (instancetype)showView;

@end

----------封装View的.m文件,方式一

#import "SSShowView.h"
#import "SSData.h"

@interface SSShowView()

/** 图片*/
@property (nonatomic,strong) UIImageView *iconView;

/** 名称*/
@property (nonatomic,strong) UILabel *nameLable;

@end

@implementation SSShowView

//构造工厂方法
+ (instancetype)showView {

  return [[self alloc] init];
}

//用于创建子控件
- (instancetype)initWithFrame:(CGRect)frame {

  if (self = [super initWithFrame:frame]) {

        //创建图片视图
        UIImageView *iconView = [[UIImageView alloc] init];
        [self addSubview:iconView];
        self.iconView = iconView;

        //创建文本标签
        UILabel *nameLable = [[UILabel alloc] init];
        [self addSubview:nameLable];
        self.nameLable = nameLable;
  }

  return self;
}

//用于设置子控件的Frame
-(void)layoutSubviews {
  [super layoutSubviews];

  CGFloat showW = self.frame.size.width;
  CGFloat showH = self.frame.size.height;
  self.iconView.frame = CGRectMake(0, 0, showW, showW);
  self.nameLable.frame = CGRectMake(0, showW, showW, showH - showW);
}

//用于给子控件赋值
- (void)setShowData:(SSData *)showData {

  _showData = showData;
  self.iconView.image = [UIImage imageNamed:showData.icon];
  self.nameLable.text = showData.name;

}

@end

----------封装View的.m文件,方式二

#import "SSShowView.h"
#import "SSData.h"

@interface SSShowView()

/** 图片*/
@property (nonatomic,strong) UIImageView *iconView;

/** 名称*/
@property (nonatomic,strong) UILabel *nameLable;

@end

@implementation SSShowView

//构造工厂方法
+ (instancetype)showView {

  return [[self alloc] init];
}

//在get方法中创建控件,懒加载
- (UIImageView *)iconView {

  if (_iconView == nil) {
    UIImageView *iconView = [[UIImageView alloc] init];
    [self addSubview:iconView];
    _iconView = iconView;
  }
  return _iconView;
}

//在get方法中创建控件,懒加载
- (UILabel *)nameLable {

  if (_nameLable == nil) {
    UILabel *nameLable = [[UILabel alloc] init];
    [self addSubview:nameLable];
    _nameLable = nameLable;
  }
  return _nameLable;
}

//用于设置子控件的Frame
-(void)layoutSubviews {
  [super layoutSubviews];

  CGFloat showW = self.frame.size.width;
  CGFloat showH = self.frame.size.height;
  self.iconView.frame = CGRectMake(0, 0, showW, showW);
  self.nameLable.frame = CGRectMake(0, showW, showW, showH - showW);
}

//用于给子控件赋值
- (void)setShowData:(SSData *)showData {
  _showData = showData;
  self.iconView.image = [UIImage imageNamed:showData.icon];
  self.nameLable.text = showData.name;
}

@end


----------封装后的调用

  //创建一个显示商品的UIView
  SSShowView *smallView = [SSShowView showView];
  smallView.frame = smallViewFrame;
  [self.showView addSubview:smallView];

  //设置数据
  smallView.showData = self.shopsArray[index];

五、XIB封装子控件
1.XIB可以自定义控件,即在XIB中,可以用View封装几个小的控件为一个整体
2.创建XIB
(1).选择View图标,XIB里面会自动创建一个View
(2).选择Empty图标,创建的XIB是空的
XIB
(3).设置XIB名字,名字应该与类名(要与所属的类)一致,点击哪个类,系统就会自动取与之对应的名字
这里写图片描述
3.在XIB里面创建View后设置大小,和去掉电池图标
设置
设置大小
4.把子控件拖入后,修改属性
子控件尺寸
5.设置XIB所属的类
设置类
6.子控件与类的属性连线
连线
7.代码如下

----------XIB所属的类 .h文件

#import <UIKit/UIKit.h>

@class SSData;

@interface SSShowView : UIView
/** 商品模型,用于接收商品的信息,给子控件赋值*/
@property (nonatomic,strong) SSData *showData;

//创建View
+ (instancetype)showView;

//用于创建自定义的View,然后给其子控件赋值
+ (instancetype)showViewWithShowData:(SSData *)data;

@end

----------XIB所属类 .m文件

#import "SSShowView.h"
#import "SSData.h"

@interface SSShowView()

/** 图片*/
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

/** 名称*/
@property (weak, nonatomic) IBOutlet UILabel *nameLable;

@end

@implementation SSShowView

//创建View
+ (instancetype)showView {
  //解析XIB文件
  SSShowView *showView = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] firstObject];

  return showView;
}

//用于创建自定义的View,然后给其子控件赋值
+ (instancetype)showViewWithShowData:(SSData *)data {
  SSShowView *show = [self showView];
  show.showData = data;
  return  show;
}

//重写set方法,用于给子控件赋值
- (void)setShowData:(SSData *)showData {
  _showData = showData;

  self.imageView.image = [UIImage imageNamed:showData.icon];
  self.nameLable.text = showData.name;
  NSLog(@"%@",showData.icon);
}

@end

----------封装后的调用,注意:调用的时候与纯代码封装View后的调用完全一样,所以用XIB封装更加简洁!

  //创建一个显示商品的UIView
  SSShowView *smallView = [SSShowView showView];
  smallView.frame = smallViewFrame;
  [self.showView addSubview:smallView];

  //设置数据
  smallView.showData = self.shopsArray[index];

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值