需求来源:因项目中需要做LoadingView(PS:仿美团进入页面时那种小人物跑动的动画),
和BlankView(PS:搜索结果为空的时候显示的图片或者文字).这两个需求
是后期添加的需求,虽然给所有控制器增加一个基类Controller,增加一个
blankView(空白页)&loadingView(动画view),所有控制器继承该类,在需要
的时候设置hidden属性即可,但之前的控制器都没有做继承,所以改写起来比较
麻烦,所以考虑将LoadingView和BlankView做成一个工具类,需要用到的时候
一句话就能展示和隐藏,倒也来的方便些
是后期添加的需求,虽然给所有控制器增加一个基类Controller,增加一个
blankView(空白页)&loadingView(动画view),所有控制器继承该类,在需要
的时候设置hidden属性即可,但之前的控制器都没有做继承,所以改写起来比较
麻烦,所以考虑将LoadingView和BlankView做成一个工具类,需要用到的时候
一句话就能展示和隐藏,倒也来的方便些
简述: 单例模式的工具类view,需要同时提供类方法和对象方法,以便作为接口供他人使用,
既然是单例模式,自然整个类中只有一个对象,不管通过allocInit方法,还是initWithFrame/allocWithZone/copy/copyWithZone/mutableCopy/mutableCopyWithZone方法,都只返回同一个对象,对对象进行show(显示)和dismiss(移除)操作
时,操作的都是同一个对象,在不同方法中都可以通过单例拿到同一个对象
分析过程:
a:单例模式,自然少不了[EZBlankView sharedBlankView];提供单例创建对象的
方法如下,但首先得声明全局变量:
static id instance = nil;
然后实现方法:
+(instancetype)sharedBlankView{
if(!instance) {
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
instance = [[super allocWithZone:NULL]init];
});
}
return instance;
}
b:创建对象都必须经历alloc/allocWithZone方法,所以首先重写alloc方法,返回一个单例创建的对象:
+(instancetype)alloc{
return [BFBlankView sharedBlankView];
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
return [BFBlankView sharedBlankView];
}
c:上述a的方法中,调用了allocWithZone方法,这个方法会导致调用init或者initWithFrame方法,所以这两个方法也是需要我们重写的,需要注意的是,如果我们使用init方
法创建对象,依然会继续向下执行initWithFrame方法;但如果使用initWithFrame创建
对象,就不会再调用initWithFrame方法了.
重写init方法:
-(instancetype)init{
if(self = [super init]){
}
return instance;
}
重写initWithFrame方法:
-(instancetype)initWithFrame:(CGRect)frame{
if(self = [super initWithFrame:frame]){
instance = [self customInitMethod];//调用自定义初始化控件的方法
}
return instance;
}
(PS:无论调用init方法还是initWithFrame方法,最终都会进入initWithFrame,
所以我们只在initWithFrame方法里调用初始化自定义控件的方法.注:经过测试,
用init方法创建对象时,会来回调用两次initWithFrame方法,暂时还不知道为什么
,如果有知道的还望指教,qq:422538722)
d:对于copy/copyWithZone/mutableCopy/mutableCopyWithZone
都是调用对象方法,而对象肯定是单例对象,经过以上几个步骤的处理,获得的对象
均为通一个对象,这时候的全局变量instance都是有值的
e:拥有以上的对象,我们就可以实现对象方法了,方法可以携带各种参数,如NSString类型
的参数作为title,UIImage类型的参数作为空白页的图片:
-(void)showBlankViewWithTitle:(NSString *)title imageName:(NSString *)imgName inParentView:(UIView *)parentView{
[parentView addSubview:self];
self.frame = parentView.bounds;
self.pageImgView.image = [UIImage imageNamed:imgName];
self.titleLabel.text = title;
}
(PS:这里携带了UIView类型的参数,是为了方便调用时将这个BlankView放在什么
视图上的)
f:一个view工具类,具备类方法是必须的,上面已经实现了对象方法,类方法中直接调用对象方法即可,调用对象方法时,将参数传给对象方法:
+(void)showBFBlankViewWithTitle:(NSString *)title imageName:(NSString *)imgName inParentView:(UIView *)parentView{
[[BFBlankView sharedBlankView]showBlankViewWithTitle:title imageName:imgName inParentView:parentView];
}