iOS7/8 Alert系统弹框的适配

作者: 嘞似彩笔 | 来源:发表于2016-05-06 00:34 被阅读471次

    怪物背景:

    事发当天我正戴着耳机悠闲的听着普通DISCO,有节奏的敲着代码。忽然,旁边办公桌发出一声巨响~ 带着几个字“iOS端崩溃了!”!!这声音犹如晴天霹雳,直接传入我的灵魂,瞬间爆炸。我二话不说,当时就拿出手机接上电脑运行项目跑了一遍,发现并没有什么问题。然而这时产品经理拿着上古至宝iPhone4s朝我走来,。我接过手机,接上电脑,运行一看,果然崩溃。打开“关于手机”才发现,这是传说中蕴含些许鸿蒙之气的iOS7。

    (文笔不行,实在编不下去了,总之就是在iOS7崩溃了,是UIAlertController不支持iOS7所以崩溃了。)

    发现这个之后我根本不慌~ 因为问题十分明显,。解决方法就是判断版本适配一下iOS7就可以了。不过/////我准备开始弄的时候,。。懵逼了。 这么逗地方不可能每个都写个什么if else吧,这简直就是凡人的做法。封装.... 必须得封装。。

    杀怪秘籍:

    其实最简单粗暴直接有效的方法就是自己封装自定义一个AlertView.不过这个要看个人水平了,写出来如果是5毛特效再带着拙劣的人造灵根气息,那这就没必要了。

    - - 然而我就是不太相信自己。(当然也担心后期会有各种拓展的麻烦,所以放弃了自定义一个的想法)。

    查阅各种资料思考之后,~最后用了一种自认为比较简单的方法(有个地方处理不太好,也希望有大神看到,能指点一二。)

    我选择直接利用UIViewController+Category的方法,在里面写一个统一的弹框方法,解决这个问题。

    几个显示方法如下:

    1.AlertView类型的:

    ////弹框

    //- (void)showAlertViewWithTitle:(NSString *)title message:(NSString *)message buttonTitles:(NSArray *)buttonTitles;

    //{

    //

    //    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {

    //

    //        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];

    //        for (NSInteger i = 0; i < buttonTitles.count; i++) {

    //            NSString *tempStr = buttonTitles[i];

    //            NSString *buttonTitleStr = [self formatButtonTitle:tempStr];

    //            UIAlertActionStyle actionStyle = [self actionStyleWithTitle:tempStr];

    //

    //            UIAlertAction *alertAction = [UIAlertAction actionWithTitle:buttonTitleStr style:actionStyle handler:^(UIAlertAction * _Nonnull action) {

    //                [self clickedAlertButtonWithMessage:message buttonTitle:buttonTitleStr];

    //            }];

    //            [alertController addAction:alertAction];

    //        }

    //        [self presentViewController:alertController animated:YES completion:nil];

    //    }else{

    //#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0

    //

    //        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:title message:message delegate:self cancelButtonTitle:nil otherButtonTitles:nil];

    //

    //        for (NSInteger i = 0 ; i < buttonTitles.count; i++) {

    //            NSString *tempStr = buttonTitles[i];

    //            NSString *buttonTitleStr = [self formatButtonTitle:tempStr];

    //            [alertView addButtonWithTitle:buttonTitleStr];

    //        }

    //        alertView.delegate = self;

    //        [alertView show];

    //#endif

    //    }

    //}

    2. ActionSheet类型

    ////sheet

    //- (void)showActionSheetViewWithTitle:(NSString *)title message:(NSString *)message buttonTitles:(NSArray *)buttonTitles;

    //{

    //    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {

    //        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:message preferredStyle:UIAlertControllerStyleActionSheet];

    //        for (NSInteger i = 0; i < buttonTitles.count; i++) {

    //            NSString *tempStr = buttonTitles[i];

    //            NSString *buttonTitleStr = [self formatButtonTitle:tempStr];

    //            UIAlertActionStyle actionStyle = [self actionStyleWithTitle:tempStr];

    //            UIAlertAction *alertAction = [UIAlertAction actionWithTitle:buttonTitleStr style:actionStyle handler:^(UIAlertAction * _Nonnull action) {

    //                [self clickedAlertButtonWithMessage:message buttonTitle:buttonTitleStr];

    //            }];

    //            [self disabledButtonWithAlertAction:alertAction];

    //            [alertController addAction:alertAction];

    //        }

    ////        [self disabledButtonWithSuperView:alertController.view];

    //        [self presentViewController:alertController animated:YES completion:nil];

    //    }else{

    //#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0

    //        UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];

    ////        NSInteger cancelIndex = 0;

    //        for (NSInteger i = 0 ; i < buttonTitles.count; i++) {

    //            NSString *tempStr = buttonTitles[i];

    //            NSString *buttonTitleStr = [self formatButtonTitle:tempStr];

    //            if ([self actionStyleWithTitle:tempStr] == UIAlertActionStyleDestructive) {

    //                actionSheet.destructiveButtonIndex = i;

    //            }

    //            if (![buttonTitleStr isEqualToString:@"取消"]) {

    //                [actionSheet addButtonWithTitle:buttonTitleStr];

    //            }

    //        }

    //        [actionSheet addButtonWithTitle:@"取消"];

    //        actionSheet.cancelButtonIndex = actionSheet.numberOfButtons - 1;

    //        [self disabledButtonWithSuperView:actionSheet];

    //        [actionSheet showInView:WINDOW];

    //#endif

    //    }

    //}

    (里面那个宏是为了让代码在Xcode中不会报警告,强迫症必备~。有点懒,。就直接复制项目的,需要的就自己拿去改改。记得是写在UIViewController+Category里的)

    由于- - 确实还很菜,封装的不太好,我传的参数需要有buttonTitle,而且是特定的buttonTitle,规则 “文本”+“类型”= “新的文本” (意思就是文本的字符串拼接上特定的类型字符串。。。)

    目前我用到了这么些类型:

    #define ACTIONSTYLE_CANCEL @"-CANCLE"

    #define ACTIONSTYLE_NORMAL @"-NORMAL"

    #define ACTIONSTYLE_DESTRUCTIVE @"-DESTRUCTIVE"

    #define ACTIONSTYLE_DISABLED @"+DISABELD"

    使用的时候就是:

    NSString *buttonTitle = [NSString stringWithFormat:@"取消%@",ACTIONSTYLE_CANCEL];

    所以需要有一些其它的format和获取style的方法

    //这个是iOS8 设置禁用按钮的方法

    //- (void)disabledButtonWithAlertAction:(UIAlertAction *)alertAction

    //{

    //    NSString *buttonTitle = alertAction.title;

    //    NSRange range = [buttonTitle rangeOfString:@"+"];

    //    if (range.location != NSNotFound) {

    //        NSRange rangeCancel = [buttonTitle rangeOfString:ACTIONSTYLE_DISABLED];

    //        if (rangeCancel.location != NSNotFound) {

    //            [alertAction setValue:_999999 forKey:@"titleTextColor"];

    //        }

    //        [alertAction setValue:[buttonTitle substringToIndex:range.location] forKey:@"title"];

    //

    //        alertAction.enabled = NO;

    //    }

    //}

    //这个是iOS7的

    //- (void)disabledButtonWithSuperView:(UIView *)superView{

    //    for (UIView *subView in superView.subviews) {

    //        if (subView.subviews.count > 0) {

    //            [self disabledButtonWithSuperView:subView];

    //        }

    //        if ([subView isKindOfClass:[UIButton class]]) {

    //            UIButton *button = (UIButton*)subView;

    //            NSRange range = [button.titleLabel.text rangeOfString:@"+"];

    //            if (range.location == NSNotFound) {

    ////                [button setTitle:[button.titleLabel.text substringToIndex:range.location] forState:UIControlStateNormal];

    //                [button setTitleColor:_333333 forState:UIControlStateNormal];

    //            }

    //        }

    //    }

    //}

    //这个是格式化buttonTitle的(就是截掉那后面的类型)

    //- (NSString *)formatButtonTitle:(NSString *)buttonTitle

    //{

    //    NSRange range = [buttonTitle rangeOfString:@"-"];

    //    if (range.location != NSNotFound) {

    //        return [buttonTitle substringToIndex:range.location];

    //    }

    //    return buttonTitle;

    //}

    //这是根据buttonTitle返回Action类型

    //- (UIAlertActionStyle)actionStyleWithTitle:(NSString *)title

    //{

    //    NSRange rangeCancel = [title rangeOfString:ACTIONSTYLE_CANCEL];

    //    if (rangeCancel.location != NSNotFound) {

    //        return UIAlertActionStyleCancel;

    //    }

    //    NSRange rangeNormal = [title rangeOfString:ACTIONSTYLE_DESTRUCTIVE];

    //    if (rangeNormal.location != NSNotFound) {

    //        return UIAlertActionStyleDestructive;

    //    }

    //

    //    return UIAlertActionStyleDefault;

    //}

    (好吧,看到这里可能有些人已经准备开喷了~ 没事,来吧~。我全接下了。当然,大神意见我更愿意接~)

    最后就是需要实现一下代理方法,。然后都统一调用一个自己写的方法

    //- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

    //{

    //    [self clickedAlertButtonWithMessage:nil buttonTitle:[actionSheet buttonTitleAtIndex:buttonIndex]];

    //}

    //- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

    //{

    //    [self clickedAlertButtonWithMessage:alertView.message buttonTitle:[alertView buttonTitleAtIndex:buttonIndex]];

    //}

    //自己写的方法,在需要的UIViewController 实现一下就行了。可以根据message或者buttonTitle判断来实现事件

    //- (void)clickedAlertButtonWithMessage:(NSString *)message buttonTitle:(NSString *)buttonTitle

    //{

    //}

    最后来一次使用方法:

    NSString *buttonTitle1 = [NSString stringWithFormat:@"相机%@",ACTIONSTYLE_NORMAL];

    NSString *buttonTitle2 = [NSString stringWithFormat:@"相册%@",ACTIONSTYLE_NORMAL];

    NSString *buttonTitle3 = [NSString stringWithFormat:@"取消%@",ACTIONSTYLE_CANCEL];

    //self是使用的UIViewController

    [self showActionSheetViewWithTitle:@"标题" message:@“内容” buttonTitles:@[buttonTitle1,buttonTitle2,buttonTitle3]];

    记得实现之前的clickedAlert.....这个方法,然后就可以处理各种事件了。  各种随便弹,再也不用担心iOS7和iOS8谁支持什么的问题了。

    好吧~  我承认是很辣鸡的方法~   但是,确实解决了我当时的问题。我也问了度娘女神~,但是她这次并没有帮到我什么。(不要给我说为什么不要谷歌什么的,我就是爱度娘~)

    后续:

    目前没有发现什么问题,也挺好扩展。。。除了那几个buttonTitle确实恶心。。。

    等我收到大神指点~ 再来修改升级。。。

    相关文章

      网友评论

        本文标题:iOS7/8 Alert系统弹框的适配

        本文链接:https://www.haomeiwen.com/subject/xoadrttx.html