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确实恶心。。。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容