单例view的应用:LoadingView&BlankView

需求来源:因项目中需要做LoadingView(PS:仿美团进入页面时那种小人物跑动的动画),
和BlankView(PS:搜索结果为空的时候显示的图片或者文字).这两个需求
是后期添加的需求,虽然给所有控制器增加一个基类Controller,增加一个
blankView(空白页)&loadingView(动画view),所有控制器继承该类,在需要
的时候设置hidden属性即可,但之前的控制器都没有做继承,所以改写起来比较
麻烦,所以考虑将LoadingView和BlankView做成一个工具类,需要用到的时候
一句话就能展示和隐藏,倒也来的方便些

和BlankView(PS:搜索结果为空的时候显示的图片或者文字).这两个需求
是后期添加的需求,虽然给所有控制器增加一个基类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];
    

}





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值