GiGaMaskTime/GIGA/Common/JXTAlertManager/AlertView/JXTAlertView.m

545 lines
16 KiB
Objective-C
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// JXTAlertView.m
// JXTAlertManager
//
// Created by JXT on 2016/12/20.
// Copyright © 2016年 JXT. All rights reserved.
//
#import "JXTAlertView.h"
#pragma mark - Private
/**
* 取消按钮默认标题
*/
static NSString *const JXTCancelButtonTitleDefault = @"确定";
/**
* toast默认展示时间当设置为0时用该值
*/
static NSTimeInterval const JXTToastShowDurationDefault = 1.0f;
/**
* alertView子视图key
*/
static NSString *const JXTAlertViewAccessoryViewKey = @"accessoryView";
#pragma mark - Public
//1.常规alert
void jxt_showAlertTwoButton(NSString *title, NSString *message, NSString *cancelButtonTitle, JXTAlertClickBlock cancelBlock, NSString *otherButtonTitle, JXTAlertClickBlock otherBlock)
{
jxt_getSafeMainQueue(^{
[JXTAlertView showAlertViewWithTitle:title message:message cancelButtonTitle:cancelButtonTitle otherButtonTitle:otherButtonTitle cancelButtonBlock:cancelBlock otherButtonBlock:otherBlock];
});
}
void jxt_showAlertOneButton(NSString *title, NSString *message, NSString *cancelButtonTitle, JXTAlertClickBlock cancelBlock)
{
jxt_showAlertTwoButton(title, message, cancelButtonTitle, cancelBlock, nil, NULL);
}
void jxt_showAlertTitle(NSString *title)
{
jxt_showAlertTwoButton(title, nil, JXTCancelButtonTitleDefault, NULL, nil, NULL);
}
void jxt_showAlertMessage(NSString *message)
{
jxt_showAlertTwoButton(@"", message, JXTCancelButtonTitleDefault, NULL, nil, NULL);
}
void jxt_showAlertTitleMessage(NSString *title, NSString *message)
{
jxt_showAlertTwoButton(title, message, JXTCancelButtonTitleDefault, NULL, nil, NULL);
}
//2.无按钮toast
void jxt_showToastTitleMessageDismiss(NSString *title, NSString *message, NSTimeInterval duration, JXTAlertClickBlock dismissCompletion)
{
jxt_getSafeMainQueue(^{
[JXTAlertView showToastViewWithTitle:title message:message duration:duration dismissCompletion:dismissCompletion];
});
}
void jxt_showToastTitleDismiss(NSString *title, NSTimeInterval duration, JXTAlertClickBlock dismissCompletion)
{
jxt_showToastTitleMessageDismiss(title, nil, duration, dismissCompletion);
}
void jxt_showToastMessageDismiss(NSString *message, NSTimeInterval duration, JXTAlertClickBlock dismissCompletion)
{
jxt_showToastTitleMessageDismiss(@"", message, duration, dismissCompletion);
}
void jxt_showToastTitle(NSString *title, NSTimeInterval duration)
{
jxt_showToastTitleMessageDismiss(title, nil, duration, NULL);
}
void jxt_showToastMessage(NSString *message, NSTimeInterval duration)
{
jxt_showToastTitleMessageDismiss(@"", message, duration, NULL);
}
//3.文字HUD
void jxt_showTextHUDTitleMessage(NSString *title, NSString *message)
{
jxt_getSafeMainQueue(^{
[JXTAlertView showTextHUDWithTitle:title message:message];
});
}
void jxt_showTextHUDTitle(NSString *title)
{
jxt_showTextHUDTitleMessage(title, nil);
}
void jxt_showTextHUDMessage(NSString *message)
{
jxt_showTextHUDTitleMessage(@"", message);
}
//4.loadHUD
void jxt_showLoadingHUDTitleMessage(NSString *title, NSString *message)
{
jxt_getSafeMainQueue(^{
[JXTAlertView showLoadingHUDWithTitle:title message:message];
});
}
void jxt_showLoadingHUDTitle(NSString *title)
{
jxt_showLoadingHUDTitleMessage(title, nil);
}
void jxt_showLoadingHUDMessage(NSString *message)
{
jxt_showLoadingHUDTitleMessage(@"", message);
}
//5.progressHUD
void jxt_showProgressHUDTitleMessage(NSString *title, NSString *message)
{
jxt_getSafeMainQueue(^{
[JXTAlertView showProgressHUDWithTitle:title message:message];
});
}
void jxt_showProgressHUDTitle(NSString *title)
{
jxt_showProgressHUDTitleMessage(title, nil);
}
void jxt_showProgressHUDMessage(NSString *message)
{
jxt_showProgressHUDTitleMessage(@"", message);
}
void jxt_setHUDProgress(float progress)
{
[JXTAlertView setHUDProgress:progress];
}
//6.HUD公用
//成功状态
void jxt_setHUDSuccessTitleMessage(NSString *title, NSString *message)
{
jxt_getSafeMainQueue(^{
[JXTAlertView setHUDSuccessStateWithTitle:title message:message];
});
}
void jxt_setHUDSuccessTitle(NSString *title)
{
jxt_setHUDSuccessTitleMessage(title, nil);
}
void jxt_setHUDSuccessMessage(NSString *message)
{
jxt_setHUDSuccessTitleMessage(@"", message);
}
//失败状态
void jxt_setHUDFailTitleMessage(NSString *title, NSString *message)
{
jxt_getSafeMainQueue(^{
[JXTAlertView setHUDFailStateWithTitle:title message:message];
});
}
void jxt_setHUDFailTitle(NSString *title)
{
jxt_setHUDFailTitleMessage(title, nil);
}
void jxt_setHUDFailMessage(NSString *message)
{
jxt_setHUDFailTitleMessage(@"", message);
}
//关闭HUD
void jxt_dismissHUD(void)
{
jxt_getSafeMainQueue(^{
[JXTAlertView dismissHUD];
});
}
#pragma mark - define
/**
* JXTAlertType
*/
typedef NS_ENUM(NSInteger, JXTAlertType) {
JXTAlertTypeNormal,
JXTAlertTypeToast,
JXTAlertTypeHUD
};
/**
* JXTAlertHUDType
*/
typedef NS_ENUM(NSInteger, JXTAlertHUDType) {
JXTAlertHUDTypeTextOnly,
JXTAlertHUDTypeLoading,
JXTAlertHUDTypeProgress
};
@interface JXTAlertView () <UIAlertViewDelegate>
//block
@property (nonatomic, copy) JXTAlertClickBlock buttonClickBlock;
@property (nonatomic, copy) JXTAlertClickBlock completionBlock;
//type
@property (nonatomic, assign) JXTAlertType alertType;
@property (nonatomic, assign) JXTAlertHUDType alertHUDType;
//HUD附件
@property (nonatomic, strong) UIActivityIndicatorView *indicatorView;
@property (nonatomic, strong) UIProgressView *progressView;
- (instancetype)initWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitle:(NSString *)otherButtonTitle, ... NS_REQUIRES_NIL_TERMINATION;
@end
@implementation JXTAlertView
#pragma mark - Init
- (instancetype)initWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitle:(NSString *)otherButtonTitle, ...
{
self = [self initWithTitle:title message:message delegate:self cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitle, nil];
if (!self) return nil;
return self;
}
#pragma mark - shared
static JXTAlertView *__jxt_commonHUD = nil;
+ (instancetype)sharedCommonHUDWithHUDType:(JXTAlertHUDType)HUDType
{
if (__jxt_commonHUD == nil)
{
__jxt_commonHUD = [[JXTAlertView alloc] initWithTitle:nil message:nil cancelButtonTitle:nil otherButtonTitle:nil];
//
__jxt_commonHUD.alertType = JXTAlertTypeHUD;
__jxt_commonHUD.alertHUDType = HUDType;
switch (HUDType)
{
case JXTAlertHUDTypeTextOnly:
break;
case JXTAlertHUDTypeLoading:
{
//添加指示器
UIActivityIndicatorView *indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicatorView.color = [UIColor blackColor];
[indicatorView startAnimating];
__jxt_commonHUD.indicatorView = indicatorView;
//强制添加子视图
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
[__jxt_commonHUD setValue:indicatorView forKey:JXTAlertViewAccessoryViewKey];
}
else
{
[__jxt_commonHUD addSubview:indicatorView];
}
break;
}
case JXTAlertHUDTypeProgress:
{
//添加进度条
UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
progressView.progressTintColor = [UIColor blackColor];
progressView.progress = 0.0;
__jxt_commonHUD.progressView = progressView;
//强制添加子视图
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
[__jxt_commonHUD setValue:progressView forKey:JXTAlertViewAccessoryViewKey];
}
else
{
[__jxt_commonHUD addSubview:progressView];
}
break;
}
}
}
return __jxt_commonHUD;
}
+ (JXTAlertView *)sharedCommonHUD
{
return __jxt_commonHUD;
}
+ (void)clearCommonHUD
{
__jxt_commonHUD = nil;
}
//重写setValue:forUndefinedKey:方法处理不存在的key赋值防止崩溃
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
NSLog(@"key: %@ 不存在", key);
}
- (id)valueForUndefinedKey:(NSString *)key
{
NSLog(@"value: %@ 不存在", key);
return nil;
}
#pragma mark - Methods
//1.常规alert
+ (void)showAlertViewWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitle:(NSString *)otherButtonTitle cancelButtonBlock:(JXTAlertClickBlock)cancelBlock otherButtonBlock:(JXTAlertClickBlock)otherBlock
{
if (!(title.length > 0) && message.length > 0) {
title = @"";
}
JXTAlertView *alertView = [[JXTAlertView alloc] initWithTitle:title message:message cancelButtonTitle:cancelButtonTitle otherButtonTitle:otherButtonTitle, nil];
alertView.alertType = JXTAlertTypeNormal;
alertView.buttonClickBlock = ^(NSInteger buttonIndex){
if (buttonIndex == 0)
{
if (cancelBlock) {
cancelBlock(buttonIndex);
}
}
else if (buttonIndex == 1)
{
if (otherBlock) {
otherBlock(buttonIndex);
}
}
};
[alertView show];
}
//不定按钮
+ (void)showAlertViewWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle buttonIndexBlock:(JXTAlertClickBlock)buttonIndexBlock otherButtonTitles:(NSString *)otherButtonTitles, ...
{
if (!(title.length > 0) && message.length > 0) {
title = @"";
}
JXTAlertView *alertView = [[JXTAlertView alloc] initWithTitle:title message:message cancelButtonTitle:cancelButtonTitle otherButtonTitle:nil];
alertView.alertType = JXTAlertTypeNormal;
alertView.buttonClickBlock = buttonIndexBlock;
if (otherButtonTitles)
{
va_list args;//定义一个指向个数可变的参数列表指针
va_start(args, otherButtonTitles);//得到第一个可变参数地址
for (NSString *arg = otherButtonTitles; arg != nil; arg = va_arg(args, NSString *))
{
[alertView addButtonWithTitle:arg];
}
va_end(args);//置空指针
}
[alertView show];
}
//2.无按钮toast
+ (void)showToastViewWithTitle:(NSString *)title message:(NSString *)message duration:(NSTimeInterval)duration dismissCompletion:(JXTAlertClickBlock)dismissCompletion
{
if (!(title.length > 0) && message.length > 0) {
title = @"";
}
JXTAlertView *toastView = [[JXTAlertView alloc] initWithTitle:title message:message cancelButtonTitle:nil otherButtonTitle:nil];
toastView.alertType = JXTAlertTypeToast;
toastView.completionBlock = ^(NSInteger buttonIndex){
if (buttonIndex == 0)
{
if (dismissCompletion) {
dismissCompletion(buttonIndex);
}
}
};
[toastView show];
duration = duration > 0 ? duration : JXTToastShowDurationDefault;
[toastView performSelector:@selector(dismissToastView:) withObject:toastView afterDelay:duration];
}
- (void)dismissToastView:(UIAlertView *)toastView
{
[toastView dismissWithClickedButtonIndex:0 animated:YES];
}
//3.文字HUD
+ (void)showTextHUDWithTitle:(NSString *)title message:(NSString *)message
{
if (!(title.length > 0) && message.length > 0) {
title = @"";
}
JXTAlertView *textHUD = [JXTAlertView sharedCommonHUDWithHUDType:JXTAlertHUDTypeTextOnly];
textHUD.title = title;
textHUD.message = message;
// textHUD.delegate = nil;
[textHUD show];
}
//4.loadHUD
+ (void)showLoadingHUDWithTitle:(NSString *)title message:(NSString *)message
{
if (!(title.length > 0) && message.length > 0) {
title = @"";
}
JXTAlertView *loadingHUD = [JXTAlertView sharedCommonHUDWithHUDType:JXTAlertHUDTypeLoading];
loadingHUD.title = title;
loadingHUD.message = message;
[loadingHUD show];
}
//5.progressHUD
+ (void)showProgressHUDWithTitle:(NSString *)title message:(NSString *)message
{
if (!(title.length > 0) && message.length > 0) {
title = @"";
}
JXTAlertView *alertHUD = [JXTAlertView sharedCommonHUDWithHUDType:JXTAlertHUDTypeProgress];
alertHUD.title = title;
alertHUD.message = message;
[alertHUD show];
}
+ (void)setHUDProgress:(float)progress
{
JXTAlertView *alertHUD = [JXTAlertView sharedCommonHUD];
[alertHUD.progressView setProgress:progress animated:YES];
if (progress >= 1.0) {
[alertHUD.progressView setProgress:1];
// [alertHUD dismissWithClickedButtonIndex:0 animated:YES];
}
}
//6.HUD公用
+ (void)setHUDSuccessStateWithTitle:(NSString *)title message:(NSString *)message
{
JXTAlertView *alertHUD = [JXTAlertView sharedCommonHUD];
alertHUD.title = title;
alertHUD.message = message;
switch (alertHUD.alertHUDType)
{
case JXTAlertHUDTypeTextOnly:
break;
case JXTAlertHUDTypeLoading:
{
[alertHUD.indicatorView stopAnimating];
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
[alertHUD setValue:nil forKey:JXTAlertViewAccessoryViewKey];
}
else
{
[alertHUD.indicatorView removeFromSuperview];
}
alertHUD.indicatorView = nil;
break;
}
case JXTAlertHUDTypeProgress:
{
[alertHUD.progressView setProgress:1 animated:YES];
break;
}
}
}
+ (void)setHUDFailStateWithTitle:(NSString *)title message:(NSString *)message
{
JXTAlertView *alertHUD = [JXTAlertView sharedCommonHUD];
alertHUD.title = title;
alertHUD.message = message;
switch (alertHUD.alertHUDType)
{
case JXTAlertHUDTypeTextOnly:
break;
case JXTAlertHUDTypeLoading:
{
[alertHUD.indicatorView stopAnimating];
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
[alertHUD setValue:nil forKey:JXTAlertViewAccessoryViewKey];
}
else
{
[alertHUD.indicatorView removeFromSuperview];
}
alertHUD.indicatorView = nil;
break;
}
case JXTAlertHUDTypeProgress:
{
[alertHUD.progressView setProgress:0 animated:YES];
break;
}
}
}
+ (void)dismissHUD
{
JXTAlertView *alertHUD = [JXTAlertView sharedCommonHUD];
switch (alertHUD.alertHUDType)
{
case JXTAlertHUDTypeTextOnly:
break;
case JXTAlertHUDTypeLoading:
{
[alertHUD.indicatorView stopAnimating];
alertHUD.indicatorView = nil;
break;
}
case JXTAlertHUDTypeProgress:
break;
}
[alertHUD dismissWithClickedButtonIndex:0 animated:YES];
}
#pragma mark - Delegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;
{
if (self.buttonClickBlock) {
self.buttonClickBlock(buttonIndex);
}
self.buttonClickBlock = NULL;//解除闭环
}
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if (self.completionBlock) {
self.completionBlock(buttonIndex);
}
self.completionBlock = NULL;//解除闭环
switch (self.alertType)
{
case JXTAlertTypeNormal:
break;
case JXTAlertTypeToast:
{
//清理performSelector防止意外情况下的内存泄漏
[NSObject cancelPreviousPerformRequestsWithTarget:alertView selector:@selector(dismissToastView:) object:alertView];
break;
}
case JXTAlertTypeHUD:
{
//清理static
[JXTAlertView clearCommonHUD];
break;
}
}
}
@end