iOS开发总结 — UI基础(2)

268 阅读3分钟

通过plist保存数据

  • 直接将数据写在代码里,不是一种合理的做法。如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低
  • 因此可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据。如果要变动数据,直接修改数据文件即可,不用修改代码
  • 一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种"属性列表文件"的扩展名是plist,因此也称为"plist文件"
  • 文件名不能叫"Info"
// 1. 将数据写入到plist文件中
NSArray *names = @[@"1", @"2", @"3"];
NSString *path = [[NSBundle mainBundle] pathForResource:@"names" ofType:@"plist"];
BOOL flag = [names writeToFile:path atomically:YES];
if (flag) {
	NSLog(@"写入成功")
}
// 2. 从plist文件中读取数据
[NSArray arrayWithContentsOfFile:path];

模型

1. 字典转模型

  • 模型
    专门用来存放数据的对象
    一般继承NSObject,在.h文件中声明一些用来存放数据的属性
    注意添加类前缀
  • 用模型取代字典的好处
    使用字典时,一般情况下,设置数据和取出数据都使用"字符串类型的key"
    编写这些key时,编译器没有智能提示
    key容易写错,且编译器不会有任何警告和报错
    数据模型,是专门用来存放数据的对象,用它来表示数据会更加专业
    使用模型访问属性时,编译器会提供一系列的提示,提高编码效率

2. instancetype

// 提供类方法方便调用
+ (instancetype)personWithDict:(NSDictionary *)dict;

// 返回值类型检测,用instancetype作为返回值,类型不匹配会有警告
NSString *str = [DGPerson personWithDict:dict];

自定义控件

自定义控件:继承自系统的控件写一个自己的控件
目的:封装控件内部的一些细节

1. initWithFrame:

/**
 子控件最好重写initWithFrame:方法,不要重写init方法
 外部如果用init方法初始化,系统会自动调用initWithFrame:方法
 */
- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
    }
    return self;
}

2. layoutSubviews

/**
 布局子控件,设置子控件的位置和尺寸
 方法调用时机:
 当前控件第一次显示的时候
 当前控件尺寸(宽度/高度)发生改变的时候
 */
- (void)layoutSubviews {
    [super layoutSubviews];
    NSLog(@"%@", NSStringFromCGRect(self.frame));
}

xib

1. xib与storyboard对比

  • 共同点
    都用来描述软件界面
    都用Interface Builder工具类编辑
    本质都是转换成代码去创建控件
  • 不同点
    xib是轻量级的,用来描述局部的UI界面
    storyboard是重量级的,用来描述整个软件的多个界面,并且能展示多个界面之间的跳转关系

2. 基本使用

  • 加载xib文件
/**
 .c -> 编译成功 -> .o
 xib -> nib
 */
 
// 第一种方式
NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"test" owner:nil options:nil];

// 第二种方式
UINib *nib = [UINib nibWithNibName:@"test" bundle:nil]; //参数传nil,默认是mainBundle
NSArray *array = [nib instantiateWithOwner:nil options:nil];

// xib加载的控件,不设置尺寸会有默认尺寸(在xib文件中自己设置的尺寸)
UIView *view = array.firstObject;
[self.view addSubview:view];
  • 自定义view封装xib设置数据 如何打开双界面?
    打开xib文件,点击option键的同时打开.m文件
  • 如果一个控件是通过xib创建的,初始化时不会调用initWithFrame:方法
  • 如果一个控件是从xib创建出来的,初始化时会调用initWithCoder:方法
- (instancetype)initWithCoder:(NSCoder *)coder;

/// 如果一个控件是从xib创建出来的,加载完毕的时候调用
- (void)awakeFromNib;

2. 加载原理

    DGPersonView *personView = [[DGPersonView alloc] initWithCoder:nil];
    personView.frame = CGRectMake(0, 0, 70, 90);
    personView.backgroundColor = [UIColor orangeColor];
    
    UIImageView *iconImageView = [[UIImageView alloc] initWithCoder:nil];
    iconImageView.frame = CGRectMake(0, 0, 70, 70);
    iconImageView.image = [UIImage imageNamed:@"icon"];
    [personView addSubview:iconImageView];
    personView.iconImageView = iconImageView;