Files
GiGaMaskTime/GIGA/Common/JXTAlertManager/AlertController/JXTAlertController.m
T

217 lines
6.9 KiB
Objective-C
Executable File

//
// JXTAlertController.m
// JXTAlertManager
//
// Created by JXT on 2016/12/22.
// Copyright © 2016年 JXT. All rights reserved.
//
#import "JXTAlertController.h"
//toast默认展示时间
static NSTimeInterval const JXTAlertShowDurationDefault = 1.0f;
#pragma mark - I.AlertActionModel
@interface JXTAlertActionModel : NSObject
@property (nonatomic, copy) NSString * title;
@property (nonatomic, assign) UIAlertActionStyle style;
@end
@implementation JXTAlertActionModel
- (instancetype)init
{
if (self = [super init]) {
self.title = @"";
self.style = UIAlertActionStyleDefault;
}
return self;
}
@end
#pragma mark - II.JXTAlertController
/**
AlertActions配置
@param actionBlock JXTAlertActionBlock
*/
typedef void (^JXTAlertActionsConfig)(JXTAlertActionBlock actionBlock);
@interface JXTAlertController ()
//JXTAlertActionModel数组
@property (nonatomic, strong) NSMutableArray <JXTAlertActionModel *>* jxt_alertActionArray;
//是否操作动画
@property (nonatomic, assign) BOOL jxt_setAlertAnimated;
//action配置
- (JXTAlertActionsConfig)alertActionsConfig;
@end
@implementation JXTAlertController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
if (self.alertDidDismiss) {
self.alertDidDismiss();
}
}
- (void)dealloc
{
// NSLog(@"test-dealloc");
}
#pragma mark - Private
//action-title数组
- (NSMutableArray<JXTAlertActionModel *> *)jxt_alertActionArray
{
if (_jxt_alertActionArray == nil) {
_jxt_alertActionArray = [NSMutableArray array];
}
return _jxt_alertActionArray;
}
//action配置
- (JXTAlertActionsConfig)alertActionsConfig
{
return ^(JXTAlertActionBlock actionBlock) {
if (self.jxt_alertActionArray.count > 0)
{
//创建action
__weak typeof(self)weakSelf = self;
[self.jxt_alertActionArray enumerateObjectsUsingBlock:^(JXTAlertActionModel *actionModel, NSUInteger idx, BOOL * _Nonnull stop) {
UIAlertAction *alertAction = [UIAlertAction actionWithTitle:actionModel.title style:actionModel.style handler:^(UIAlertAction * _Nonnull action) {
__strong typeof(weakSelf)strongSelf = weakSelf;
if (actionBlock) {
actionBlock(idx, action, strongSelf);
}
}];
//可利用这个改变字体颜色,但是不推荐!!!
// [alertAction setValue:[UIColor grayColor] forKey:@"titleTextColor"];
//action作为self元素,其block实现如果引用本类指针,会造成循环引用
[self addAction:alertAction];
}];
}
else
{
NSTimeInterval duration = self.toastStyleDuration > 0 ? self.toastStyleDuration : JXTAlertShowDurationDefault;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self dismissViewControllerAnimated:!(self.jxt_setAlertAnimated) completion:NULL];
});
}
};
}
#pragma mark - Public
- (instancetype)initAlertControllerWithTitle:(NSString *)title message:(NSString *)message preferredStyle:(UIAlertControllerStyle)preferredStyle
{
if (!(title.length > 0) && (message.length > 0) && (preferredStyle == UIAlertControllerStyleAlert)) {
title = @"";
}
self = [[self class] alertControllerWithTitle:title message:message preferredStyle:preferredStyle];
if (!self) return nil;
self.jxt_setAlertAnimated = NO;
self.toastStyleDuration = JXTAlertShowDurationDefault;
return self;
}
- (void)alertAnimateDisabled
{
self.jxt_setAlertAnimated = YES;
}
- (JXTAlertActionTitle)addActionDefaultTitle
{
//该block返回值不是本类属性,只是局部变量,不会造成循环引用
return ^(NSString *title) {
JXTAlertActionModel *actionModel = [[JXTAlertActionModel alloc] init];
actionModel.title = title;
actionModel.style = UIAlertActionStyleDefault;
[self.jxt_alertActionArray addObject:actionModel];
return self;
};
}
- (JXTAlertActionTitle)addActionCancelTitle
{
return ^(NSString *title) {
JXTAlertActionModel *actionModel = [[JXTAlertActionModel alloc] init];
actionModel.title = title;
actionModel.style = UIAlertActionStyleCancel;
[self.jxt_alertActionArray addObject:actionModel];
return self;
};
}
- (JXTAlertActionTitle)addActionDestructiveTitle
{
return ^(NSString *title) {
JXTAlertActionModel *actionModel = [[JXTAlertActionModel alloc] init];
actionModel.title = title;
actionModel.style = UIAlertActionStyleDestructive;
[self.jxt_alertActionArray addObject:actionModel];
return self;
};
}
@end
#pragma mark - III.UIViewController扩展
@implementation UIViewController (JXTAlertController)
- (void)jxt_showAlertWithPreferredStyle:(UIAlertControllerStyle)preferredStyle title:(NSString *)title message:(NSString *)message appearanceProcess:(JXTAlertAppearanceProcess)appearanceProcess actionsBlock:(JXTAlertActionBlock)actionBlock
{
if (appearanceProcess)
{
JXTAlertController *alertMaker = [[JXTAlertController alloc] initAlertControllerWithTitle:title message:message preferredStyle:preferredStyle];
//防止nil
if (!alertMaker) {
return ;
}
//加工链
appearanceProcess(alertMaker);
//配置响应
alertMaker.alertActionsConfig(actionBlock);
// alertMaker.alertActionsConfig(^(NSInteger buttonIndex, UIAlertAction *action){
// if (actionBlock) {
// actionBlock(buttonIndex, action);
// }
// });
if (alertMaker.alertDidShown)
{
[self presentViewController:alertMaker animated:!(alertMaker.jxt_setAlertAnimated) completion:^{
alertMaker.alertDidShown();
}];
}
else
{
[self presentViewController:alertMaker animated:!(alertMaker.jxt_setAlertAnimated) completion:NULL];
}
}
}
- (void)jxt_showAlertWithTitle:(NSString *)title message:(NSString *)message appearanceProcess:(JXTAlertAppearanceProcess)appearanceProcess actionsBlock:(JXTAlertActionBlock)actionBlock
{
[self jxt_showAlertWithPreferredStyle:UIAlertControllerStyleAlert title:title message:message appearanceProcess:appearanceProcess actionsBlock:actionBlock];
}
- (void)jxt_showActionSheetWithTitle:(NSString *)title message:(NSString *)message appearanceProcess:(JXTAlertAppearanceProcess)appearanceProcess actionsBlock:(JXTAlertActionBlock)actionBlock
{
[self jxt_showAlertWithPreferredStyle:UIAlertControllerStyleActionSheet title:title message:message appearanceProcess:appearanceProcess actionsBlock:actionBlock];
}
@end