昨天漏了一天没做笔记,原因是在前天的学习计划没全部完成,所以昨天早上终于补全了,结果在倒弄安装第三方插件的时候才发现原来Xcode8开始已经禁止安装插件了.一开始通过复制另一份Xcode然后通过修改名字,添加签名,获取UUID等一系列操作还是能够在复制出来的Xcode上面成功安装插件的.但我有点手贱而且作为学生党省吃俭用才买下的RMBP 128G.复制的方法占用了10G的内存,无法接受.最后一通瞎搞终于把这个软件搞崩溃了,一输入就闪退.所以我经历了删除-appStore龟速下载(XcodeGhost事件让我不敢相信网盘,虽然我没经历过)-花了6个小时终于重新安装,发现还是闪退---查找原因删除残留的插件到了昨天晚上10点才搞定我的天,所以边回忆知识点边敲了2小时的代码,早上又跑去看美国春晚折腾到现在才能记录上这两天的东西
第五天的知识点大概是还是之前第三天第四天的一个拓展,一个是控件通过代码在初始化时调用的一个方法,第二个是通过Xib来自定义控件(不得不说这货比代码来创建简单多了)第三是巩固字典转成模型的套路,第四是UIButton内部属性的一些使用(包含了UIImageView,UILabel)第五是一个渐变动画的学习,第六是KVC&KVO的一个了解,初步学习.
控件通过代码初始化
通过[[类名 alloc]init还是[[类名 alloc]initWithFrame创建对象时系统会调用initWithFrame方法,因此在初始化控件的一些代码可以通过重写initWithFrame方法来实现
Xib
Xib类似一个Storyboard,不过是一个自定义控件的一个功能,通过创建Xib,在ViewController.m获取Xib的路径来加载Xib,注入数据 下面通过一个demo来说明
- 这是Xib的界面
模拟新闻软件的一个控件
通过创建一个继承UIView的类与它关联,进行导入数据,核心代码如下:
@class CarData;
//引入数据模型的类
@interface CarView : UIView
@property (nonatomic, strong) CarData *car;
//接收数据模型
- (instancetype)initWithCar:(CarData *)car;
+ (instancetype)carview;
//提供两个快速构造方法
@end
#import "CarData.h"
@interface CarView ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
//显示图片控件
@property (weak, nonatomic) IBOutlet UILabel *title;
//主标题
@property (weak, nonatomic) IBOutlet UILabel *subtitle;
//子标题
@property (weak, nonatomic) IBOutlet UILabel *follow;
//跟帖数
@end
@implementation CarView
-(void)setCar:(CarData *)car
{
_car = car;
self.imageView.image = [UIImage imageNamed:car.image];
//将数据模型导入到控件中
self.title.text = car.title;
self.subtitle.text = car.subTitle;
self.follow.text = car.follow;
}
- (instancetype)initWithCar:(CarData *)car
{
if (self = [super init]) {
_car = car;
}
return self;
}
+ (instancetype)carview
{
return [[[NSBundle mainBundle]loadNibNamed:@"CarView" owner:nil options:nil]firstObject];
//加载Supporting Files中的xib文件
}
@end
- (void)viewDidLoad {
CarView *image = [CarView carview];
//加载Xib控件
image.frame = CGRectMake(0, 100, 375, 100);
//设置位置
NSDictionary *dict = @{@"image":@"car",@"title":@"2016款兰博基尼",@"subtitle":@"2016款兰博基尼 非常好看",@"follow":@"233跟帖"};
//数据
CarData *cardata = [CarData cardataWithDict:dict];
[image setCar:cardata];
[self.view addSubview:image];
}
运行时的截图
如何让Xib和一个类关联呢?
创建xib时,View的大小不可调,这个时候
字典转模型
在模型的.h文件中创建所有数据的属性,创建快速构造方法,快速构造方法中药接受一个字典,把字典的键对值取出并赋值给属性
例如上一个demo中的,数据包括图片,子标题,主标题,跟帖数,所以创建一个模型时,把所有需要的数据内容都创建对应的属性
#import <Foundation/Foundation.h>
@interface CarData : NSObject
//标题
@property (nonatomic, copy) NSString *title;
//子标题
@property (nonatomic, copy) NSString *subTitle;
//图片
@property (nonatomic, copy) NSString *image;
//跟帖数
@property (nonatomic, copy) NSString *follow;
-(instancetype)initWithDict:(NSDictionary *)dict;
+(instancetype)cardataWithDict:(NSDictionary *)dict;
@end
UIButton的内部属性
利用UIButton的内部属性,改善dayFour的模拟购物车demo,创建一个继承UIButton的类,然后在类里面修改UIButton的属性,具体代码如下:
#import <UIKit/UIKit.h>
@class Shopdata;
@interface button : UIButton
@property (nonatomic, strong) Shopdata *shopdata;
//接收一个数据模型
@end
#import "Shopdata.h"
@implementation button
- (instancetype)initWithFrame:(CGRect)frame
{
//重写initWithFrame方法,初始化内部属性
if (self = [super initWithFrame:frame]) {
self.titleLabel.textAlignment = NSTextAlignmentCenter;
[self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
}
return self;
}
-(void)layoutSubviews{
//改变内部空间布局
[super layoutSubviews];
CGFloat width = self.frame.size.width;
CGFloat height = self.frame.size.height;
//获取控件大小
self.titleLabel.frame = CGRectMake(0, width, width, height - width);
//改变内部控件大小
self.imageView.frame = CGRectMake(0, 0, width, width);
}
//注入数据
- (void)setShopdata:(Shopdata *)shopdata
{
_shopdata = shopdata;
[self setImage:[UIImage imageNamed:shopdata.icon] forState:UIControlStateNormal];
//因为是UIButton 所以设置图片和文字应该通过set方法
[self setTitle:shopdata.name forState:UIControlStateNormal];
}
截图如下:
渐变动画
利用渐变动画来做一个提示框,沿用上一个demo,先在Storyboard中创建一个UILabel 将透明度设置为0,当购物车满时,提示购物车满了,渐变显示.当删除商品直至为0时,提示购物车已空.同样是渐变显示,核心代码如下:
/*
animateWithDuration 动画时长
animations: 需要完成的动作
completion:^(BOOL finished) 结束时需要完成的动作
delay:延时
options:动画播放的方式
*/
- (void)showHUB:(NSString *)text{
[UIView animateWithDuration:1.f animations:^{
self.showHUB.alpha = 1;
self.showHUB.text = text;
} completion:^(BOOL finished) {
[UIView animateWithDuration:1.f delay:0.5f options:UIViewAnimationOptionCurveLinear animations:^{
self.showHUB.alpha = 0;
} completion:nil];
}];
}
截图如下:
(不能上传Gif无法看出动画心情复杂)
KVC&KVO
KVC:Key Value Coding (键值编码)
KVO:Key Value Observing (键值监听)
KVC的功能略强大,可以简单赋值也可以综合赋值,甚至可以给私有属性赋值等等,直接代码和注释说明吧
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
Person *per = [[Person alloc]init];
per.dog = [[Dog alloc]init];
/*********对私有变量赋值*****************/
[per setValue:@"20" forKey:@"age"];
/*********普通赋值*****************/
[per setValue:@"zjh" forKeyPath:@"_name"];
/*********综合赋值*****************/
[per setValue:@"wangcai" forKeyPath:@"dog.name"];
NSLog(@"%@",per.dog.name);
NSLog(@"%@",per);
/*********字典转模型*****************/
NSDictionary *dict1 = @{
@"name":@"zgh",@"age":@"25"
};
Person *per2 = [[Person alloc]init];
[per2 setValuesForKeysWithDictionary:dict1];
NSLog(@"%@",per2);
/*********取值*****************/
Person *per3 = [[Person alloc]init];
per3.name = @"wangcai";
NSLog(@"%@",[per3 valueForKeyPath:@"name"]);
/*********字典转模型*****************/
Person *per4 = [[Person alloc]init];
per4.name = @"didi";
per4.money = 199.99;
NSDictionary *dict = [per4 dictionaryWithValuesForKeys:@[@"name",@"money"]];
NSLog(@"%@",dict);
/*********取出数组中所有模型的摸个属性*****************/
NSArray *arr = @[per,per3,per4];
NSArray *arrNew = [arr valueForKeyPath:@"name"];
NSLog(@"%@",arrNew);
KVC的部分功能如上,结果就不截图了,因为太多,控制台打印太杂乱,而且只是简单入门的学一下,到时候再深入的学习
KVO这是监听一个属性的变化
比如监听Person这个类这name
Person *per5 = [[Person alloc]init];
per5.name = @"xxx";
/*
addObserver: 监听者
forKeyPath: 监听属性
options:监听方式
*/
[per5 addObserver:per5 forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
per5.name = @"zzz";
/*
这里需要重写observeValueForKeyPath方法,context:是
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
NSLog(@"%@______%@________%@",keyPath,object,change);
}
今天爱国者第四节逆转了夺得今年的超级碗,从未有球队做到在前三节落后19+还能逆转取胜的,真的到处都有奇迹,我觉得我也可以通过不懈的努力逆转自己目前的困境,keep move