如果想要一个对象一初始化出来属性中就有某些值,那么我们就可以重写他的构造方法(init方法)
- (instancetepy) init{
if(self=[super init]){
//初始化属性
}
return self;
}
懒加载
为了防止重写控件初始化方法不成功,会采用下面这样的双保险写法只要才用这种写法,无论控件是如何创建的都会成功重写控件的初始化方法
/**
*控件属性设置方法
*/
- (void) setup
{
//初始化控件的那些属性
}
/**
*重写控件initWithFrame:(CGRect)frame初始化方法,
这个方法只要控件是通过代码创建的,那么就会在控件初始化时调用这个方法
*/
- (instancetype)initWithFrame:(CGRect)frame
{
if (self=[super initWithFrame:frame]) {
[self setup];
}
return self;
}
/**
*重写控件awakeFromNib初始化方法,
这个方法只要控件是通过Xib或storyboard创建的,那么就会在控件初始化时调用这个方法
*/
- (void)awakeFromNib
{
[self setup];
}
通过代码创建自定义控件
- 通过创建类,来写一个自定义控件,并且继承于系统自带的控件
- 目的:封装控件内部的细节,不让控制器知道
- 步骤:
- 新建一个继承系统控件的类
- 在initWithFrame方法中添加子控件
- 在layoutSubviews方法中这只子控件的frame
- 在layoutSubview方法中,一定要调用[super layoutSubviews]
- 提供一个模型属性,重写模型属性的set方法
- 在重写set方法中,取出模型的属性给对应子控件赋值
通过Xib自定义控件
- 新建一个继承自系统控件的自定义控件类
- 新建一个Xib文件 (文件名一定要和自定义控件类类名一致,方便别人阅读代码)
- 修改xib主控件的Class类名,和他相匹配的自定义控件类名一致
- 往主控件中添加子控件,设置子控件属性
- 在自定义控件的.m文件中,添加类扩展
- 通过xib到自定义控件类.m文件类扩展的连线,把xib子控件添加到类扩展的属性中
- 在自定义控件类.h文件中添加模型属性,重写模型属性的set方法
通过以上对比我们得出结论
- 通过xib自定义控件相比于通过代码自定义控件,节省了两个步骤
1.减少了通过initWithFrame方法中添加子控件的步骤
2.减少了通过layoutSubviews方法中这只子控件的framed步骤
plist文件和xib文件的加载方法
- 获取plist文件的全路径方法
- 用到了- (nullable NSString *)pathForResource:(nullable NSString *)name ofType:(nullable NSString *)ext;
NSString * file=[[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"];
//把plist文件中的数组给dictArray
NSArray * dictArray=[NSArray arrayWithContentsOfFile:file];
- 获取xib文件的全路径方法
- 获取xib文件的方法:- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options
WLSubView *subView=[[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self)
owner:nil options:nil] firstObject];
神奇三部曲给结构体赋值
CGRect tempFrame=self.imageView.frame;
tempFrame.size.width=0;
tempFrame.size.height=0;
self.imageView.frame=tempFrame;