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

217 lines
6.9 KiB
Objective-C
Executable File
Raw Permalink 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.

//
// 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