盖士人读书,第一要有志,第二要有识,第三要有恒。有志则断不甘为下流;有识则知学问无穷,不敢以一得自足,如河泊之观海,如牛蛙之窥天,皆无识者也;有恒则断无不成之事。此三者缺一不可。 --------曾国藩
换工作快两个月了,这段时间一直在忙工作的事,也没有抽时间再写总结文章,好逸恶劳的本性也就慢慢显露出来了,在此自我批斗一下。以后不管写多写少,一定做事有恒。
一、小型模型数据存储
有一个需求是要存储正在播放音频的数据,由于音频的数据都已经被数据转模型了,且NSUserDefault无法存储对象类型,所以我们需要解归档。
#define PRO_STRONG @property (nonatomic,strong)
PRO_STRONG NSString<Optional> *bookImg;
PRO_STRONG NSString<Optional> *bookSubtitle;
PRO_STRONG NSNumber<Optional> *length;
PRO_STRONG NSNumber<Optional> *language;
PRO_STRONG NSNumber<Optional> *updateTime;
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.bookImg forKey:@"bookImg"];
[aCoder encodeObject:self.bookSubtitle forKey:@"bookSubtitle"];
[aCoder encodeObject:self.length forKey:@"length"];
[aCoder encodeObject:self.language forKey:@"language"];
[aCoder encodeObject:self.updateTime forKey:@"updateTime"];
}
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.bookImg = [aDecoder decodeObjectForKey:@"bookImg"];
self.bookSubtitle = [aDecoder decodeObjectForKey:@"bookSubtitle"];
self.length = [aDecoder decodeObjectForKey:@"length"];
self.language = [aDecoder decodeObjectForKey:@"language"];
self.updateTime = [aDecoder decodeObjectForKey:@"updateTime"];
}
return self;
}
二、对象的赋值
问题:
对象A中的参数远少于对象B,但是要传值B的数据类型,这里难为了我好久。
办法:
其实也是很简单的问题。我们只需要将A对象的中相应的参数赋值给B就行了,数据不足就不足了,没必要求全,因为本身数据就不全。我就是犯了求全的错误。
三、修改Xib创建的View的frame
问题:Xib的frame本是无法修改的,我们可以通过设置来重新修改相应的值.
1、找到连线的View,然后找到具体的设置,如下图所示:
2、我们需要重新设置相应参数的值(constant)
#pragma mark 如果先被隐藏,然后再订课,那么就无法再次刷新,因为已经被隐藏,高度为0,所以我们需要重新设置。
- (void)hiddenBookViewCourse{
//我们重新设置约束值
self.bookViewCourse.hidden = YES;
self.courseHeight.constant = 0;
}
- (void)displayBookViewCourse{
self.bookViewCourse.hidden = NO;
self.courseHeight.constant = 209.0;
}
3、为了防止Xib先覆盖掉我们做的处理,我们最好延迟加在我们的改动。
[self performSelector:@selector(hiddenBookViewCourse) withObject:nil afterDelay:0.1];
四、在TabBarItem中随意跳转
CustomTabBarViewController为TabBarItem的容器,必须在项目中使用你的TabBarViewController的类,否则跳转无效。
- (IBAction)ViewAllButton:(id)sender {
CustomTabBarViewController *tabbarVC = [[CustomTabBarViewController alloc]init];
AppDelegate *appdelegateE = (AppDelegate*)[UIApplication sharedApplication].delegate;
appdelegateE.window.rootViewController = tabbarVC;
//跳转到第二个tabbarItem
tabbarVC.selectedIndex = 1;
}
五、OC 中 覆盖属性会有提示Auto property synthesis will not synthesize property 'name' because it is 'readwrite' but it will be synthesized 'readonly' via another property
在项目的model中,子类和父类拥有相同的属性,然后就出现了这个问题。
1.问题原因:
通过声明属性,我们可以很简单的为一个成员变量定义其是否是只读的还是读写的,是否是原子操作的等等特性,也就是说如果说封装是为成员变量套了一层壳的话,那么 @property关键字做的事情就是预定义这层壳是个什么样子的壳,然后通过 @sythesize关键字生成真正的壳并把这个壳套在实际的成员变量上(如果没有定义这个成员变量该关键字也可以自动生成对应的成员变量)。当然这层壳包括了自动生成的 get set 方法。
在最开始的时候,我们在代码中写了@property对应的就要写一个@sythesize,在苹果使用了 LLVM 作为编译器以后,如果我们没有写 @sythesize,编译器就会为我们自动的生成一个 @sythesize property = _property。这个特性叫做Auto property synthesize。
Auto property synthesis will not synthesize property 'name' because it is 'readwrite' but it will be synthesized 'readonly' via another property
2.操作的处理过程
当我们想覆盖父类的属性并做一些修改的时候,Auto property synthesize这个特性就有点不知道该干嘛了,这个时候他选择不跑出来为我们干活,所以编译器就不会自动生成@sythesize property = _property,但是子类总得有个壳啊,人家都有@property了,怎么办?直接拿过来父类的壳复制一份不管三七二十一套在子类的成员变量身上。
3.解决办法
在子类中显式的声明一个@synthesize name = _name;就好,这样子类就会如愿的产生他的壳,编译器也不纠结了,就去掉了 warning,从此,天下太平~
//父类有了description属性,子类再有就会出问题。
@property (nonatomic,copy) NSString<Optional> *description;
//处理方式
@implementation StudentCommentModel
@synthesize description = _description;
@end