New file |
| | |
| | | // |
| | | // JXTAlertController.m |
| | | // JXTAlertManager |
| | | // |
| | | // Created by JXT on 2016/12/22. |
| | | // Copyright © 2016年 JXT. All rights reserved. |
| | | // |
| | | |
| | | #import "JXTAlertController.h" |
| | | #import "UIWindow+CurrentViewController.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 |
| | | { |
| | | NSLogFunc; |
| | | } |
| | | |
| | | #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实现如果引用本类指针,会造成循环引用 |
| | | [weakSelf 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; |
| | | } |
| | | |
| | | |
| | | #pragma mark - addButton |
| | | |
| | | - (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 ?: appearanceProcess(alertMaker); |
| | | //配置响应 |
| | | alertMaker.alertActionsConfig(actionBlock); |
| | | |
| | | [self presentViewController:alertMaker animated:!(alertMaker.jxt_setAlertAnimated) completion:^{ |
| | | !alertMaker.alertDidShown ?: alertMaker.alertDidShown(); |
| | | }]; |
| | | } |
| | | } |
| | | |
| | | - (void)jxt_showAlertWithTitle:(NSString *)title message:(NSString *)message appearanceProcess:(JXTAlertAppearanceProcess)appearanceProcess actionsBlock:(JXTAlertActionBlock)actionBlock |
| | | { |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | [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 |
| | | { |
| | | dispatch_async(dispatch_get_main_queue(), ^{ |
| | | [self jxt_showAlertWithPreferredStyle:UIAlertControllerStyleActionSheet title:title message:message appearanceProcess:appearanceProcess actionsBlock:actionBlock]; |
| | | }); |
| | | } |
| | | |
| | | |
| | | @end |
| | | |
| | | @implementation UIAlertController (LMJ) |
| | | |
| | | /** |
| | | JXTAlertController: show-alert(iOS8) |
| | | |
| | | @param title title |
| | | @param message message |
| | | @param appearanceProcess alert配置过程 |
| | | @param actionBlock alert点击响应回调 |
| | | */ |
| | | + (void)mj_showAlertWithTitle:(nullable NSString *)title |
| | | message:(nullable NSString *)message |
| | | appearanceProcess:(JXTAlertAppearanceProcess)appearanceProcess |
| | | actionsBlock:(nullable JXTAlertActionBlock)actionBlock NS_AVAILABLE_IOS(8_0) |
| | | { |
| | | [[UIWindow zf_currentViewController] jxt_showAlertWithTitle:title message:message appearanceProcess:appearanceProcess actionsBlock:actionBlock]; |
| | | } |
| | | |
| | | /** |
| | | JXTAlertController: show-actionSheet(iOS8) |
| | | |
| | | @param title title |
| | | @param message message |
| | | @param appearanceProcess actionSheet配置过程 |
| | | @param actionBlock actionSheet点击响应回调 |
| | | */ |
| | | + (void)mj_showActionSheetWithTitle:(nullable NSString *)title |
| | | message:(nullable NSString *)message |
| | | appearanceProcess:(JXTAlertAppearanceProcess)appearanceProcess |
| | | actionsBlock:(nullable JXTAlertActionBlock)actionBlock NS_AVAILABLE_IOS(8_0) |
| | | { |
| | | [[UIWindow zf_currentViewController] jxt_showActionSheetWithTitle:title message:message appearanceProcess:appearanceProcess actionsBlock:actionBlock]; |
| | | } |
| | | @end |
| | | |