怪物背景:
事发当天我正戴着耳机悠闲的听着普通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确实恶心。。。
等我收到大神指点~ 再来修改升级。。。
原文链接:http://www.jianshu.com/p/b5d97f747002
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。