iOS7/8 Alert系统弹框的适配

怪物背景:

事发当天我正戴着耳机悠闲的听着普通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系统弹框的适配)