IOS8 AlertView和ActionSheet不兼容问题解决方案

具体代码附文末。先演示一下怎么使用。

AlertView的情况

- (void)creatAlertView
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"title" message:@"message" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
    [alertView show];
}

#pragma mark UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex) {
        case 0:
            
            break;
        case 1:
            
            break;
            
        default:
            break;
    }
}

#pragma mark Use NewObject(AlertView)
- (void)creatAlertView
{
    BOAlertController *alertView = [[BOAlertController alloc] initWithTitle:@"title" message:@"message" viewController:self];
    
    RIButtonItem *cancelItem = [RIButtonItem itemWithLabel:@"取消" action:^{
        
    }];
    [alertView addButton:cancelItem type:RIButtonItemType_Cancel];
    
    RIButtonItem *okItem = [RIButtonItem itemWithLabel:@"确定" action:^{
        
    }];
    [alertView addButton:okItem type:RIButtonItemType_Destructive];
    [alertView show];
}

ActionSheet的情况

- (void)creatActionSheet
{
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"title" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:@"其它功能", nil];
    [actionSheet showInView:self.view];
}

#pragma mark UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex) {
        case 0:
            
            break;
        case 1:
            
            break;
            
        default:
            break;
    }
}

#pragma mark Use NewObject(ActionSheet)
- (void)creatActionSheet
{
    BOAlertController *actionSheet = [[BOAlertController alloc] initWithTitle:@"title" message:nil viewController:self];
    
    RIButtonItem *cancelItem = [RIButtonItem itemWithLabel:@"取消" action:^{
        
    }];
    [actionSheet addButton:cancelItem type:RIButtonItemType_Cancel];
    
    RIButtonItem *okItem = [RIButtonItem itemWithLabel:@"确定" action:^{
        
    }];
    [actionSheet addButton:okItem type:RIButtonItemType_Destructive];
    
    [actionSheet showInView:self.view];
}

使用这个封装类需要扩展类UIAlertView-Blocks的支持。下载地址https://github.com/jivadevoe/UIAlertView-Blocks

封装类代码

//  Created by 孙俊 on 14-9-25.
//  Copyright (c) 2014年 yipinapp.ibrand. All rights reserved.
//

typedef enum {
    RIButtonItemType_Cancel         = 1,
    RIButtonItemType_Destructive       ,
    RIButtonItemType_Other
}RIButtonItemType;

typedef enum {
    BOAlertControllerType_AlertView    = 1,
    BOAlertControllerType_ActionSheet
}BOAlertControllerType;

#define isIOS8  ([[[UIDevice currentDevice]systemVersion]floatValue]>=8)

#import <Foundation/Foundation.h>
#import "RIButtonItem.h"

@interface BOAlertController : NSObject

- (id)initWithTitle:(NSString *)title message:(NSString *)message viewController:(UIViewController *)inViewController;
- (void)addButton:(RIButtonItem *)button type:(RIButtonItemType)itemType;

//Show ActionSheet in all versions
- (void)showInView:(UIView *)view;

//Show AlertView in all versions
- (void)show;

@end

#import "BOAlertController.h"
#import "UIActionSheet+Blocks.h"
#import "UIAlertView+Blocks.h"

@interface BOAlertController()

@property (nonatomic, strong) NSString              *title;
@property (nonatomic, strong) NSString              *message;
@property (nonatomic, weak) UIViewController        *inViewController;
@property (nonatomic, strong) NSMutableDictionary   *buttonInfoDict;

@end

@implementation BOAlertController

- (id)initWithTitle:(NSString *)title message:(NSString *)message viewController:(UIViewController *)inViewController
{
    if (self = [super init]) {
        self.title = title;
        self.message = message;
        self.inViewController = inViewController;
    }
    return self;
}

- (NSMutableDictionary *)buttonInfoDict
{
    if (_buttonInfoDict == nil) {
        _buttonInfoDict = [NSMutableDictionary dictionary];
    }
    return _buttonInfoDict;
}

- (void)addButton:(RIButtonItem *)button type:(RIButtonItemType)itemType
{
    if (button == nil || ![button isKindOfClass:[RIButtonItem class]]) {
        return;
    }
    switch (itemType) {
        case RIButtonItemType_Cancel:
        {
            [self.buttonInfoDict setObject:button forKey:@"RIButtonItemType_Cancel"];
        }
            break;
        case RIButtonItemType_Destructive:
        {
            [self.buttonInfoDict setObject:button forKey:@"RIButtonItemType_Destructive"];
        }
            break;
        case RIButtonItemType_Other:
        {
            NSMutableArray *otherArray = self.buttonInfoDict[@"RIButtonItemType_Other"];
            if (otherArray == nil) {
                otherArray = [NSMutableArray array];
            }
            [otherArray addObject:button];
            [self.buttonInfoDict setObject:otherArray forKey:@"RIButtonItemType_Other"];
        }
            break;
            
        default:
            break;
    }
}

- (void)showInView:(UIView *)view
{
    if (isIOS8) {
        [self showIOS8ViewWithType:BOAlertControllerType_ActionSheet];
        
    } else {
        [self ios7showInView:view];
    }
}

- (void)show
{
    if (isIOS8) {
        [self showIOS8ViewWithType:BOAlertControllerType_AlertView];
        
    } else {
        [self ios7Show];
    }
}

- (void)showIOS8ViewWithType:(BOAlertControllerType)viewType
{
    if (self.inViewController == nil) {
        return;
    }
    
    UIAlertController *alertController = nil;
    switch (viewType) {
        case BOAlertControllerType_AlertView:
        {
            alertController = [UIAlertController alertControllerWithTitle:self.title message:self.message preferredStyle:UIAlertControllerStyleAlert];
        }
            break;
        case BOAlertControllerType_ActionSheet:
        {
            alertController = [UIAlertController alertControllerWithTitle:self.title message:self.message preferredStyle:UIAlertControllerStyleActionSheet];
        }
            break;
            
        default:
            break;
    }
    
    RIButtonItem *cancelItem = self.buttonInfoDict[@"RIButtonItemType_Cancel"];
    if (cancelItem != nil) {
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:cancelItem.label style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
            cancelItem.action();
        }];
        [alertController addAction:cancelAction];
    }
    
    RIButtonItem *destructiveItem = self.buttonInfoDict[@"RIButtonItemType_Destructive"];
    if (destructiveItem != nil) {
        UIAlertAction *destructiveAction = [UIAlertAction actionWithTitle:cancelItem.label style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
            destructiveItem.action();
        }];
        [alertController addAction:destructiveAction];
    }
    
    NSArray *otherItems = self.buttonInfoDict[@"RIButtonItemType_Other"];
    if (otherItems != nil && otherItems.count > 0) {
        for (RIButtonItem *buttonItem in otherItems) {
            UIAlertAction *otherAction = [UIAlertAction actionWithTitle:buttonItem.label style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
                buttonItem.action();
            }];
            [alertController addAction:otherAction];
        }
    }
    
    [self.inViewController presentViewController:alertController animated:YES completion:nil];
}

- (void)ios7showInView:(UIView *)view
{
    
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:self.title cancelButtonItem:self.buttonInfoDict[@"RIButtonItemType_Cancel"] destructiveButtonItem:self.buttonInfoDict[@"RIButtonItemType_Destructive"] otherButtonItems: nil];
    
    NSArray *otherItems = self.buttonInfoDict[@"RIButtonItemType_Other"];
    if (otherItems != nil && otherItems.count > 0) {
        for (RIButtonItem *buttonItem in otherItems) {
            [actionSheet addButtonItem:buttonItem];
        }
    }
    [actionSheet showInView:view];
}

- (void)ios7Show
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:self.title message:self.message cancelButtonItem:self.buttonInfoDict[@"RIButtonItemType_Cancel"] otherButtonItems:nil];
    
    RIButtonItem *destructiveItem = self.buttonInfoDict[@"RIButtonItemType_Destructive"];
    if (destructiveItem != nil) {
        [alertView addButtonItem:destructiveItem];
    }
    
    NSArray *otherItems = self.buttonInfoDict[@"RIButtonItemType_Other"];
    if (otherItems != nil && otherItems.count > 0) {
        for (RIButtonItem *buttonItem in otherItems) {
            [alertView addButtonItem:buttonItem];
        }
    }
    
    [alertView show];
}

@end
时间: 2024-11-07 07:41:27

IOS8 AlertView和ActionSheet不兼容问题解决方案的相关文章

UIAlertView及UIActionSheet 在ios8极其以下版本的兼容问题解决方案

本文转载至 http://www.aichengxu.com/view/35326 UIAlertView及UIActionSheet在ios8中被放弃,其功能将完全由UIAlertController代替: 1.Alert用法 UIAlertController *alert = [UIAlertControlleralertControllerWithTitle:@"This is Title" message:@"This is message" prefer

js window.showModalDialog不兼容goole解决方案

window.showModalDialog不兼容goole解决方案 一.弹框方案: 1.window.open; 2.window.showModalDialog; 3.div制作窗口:(本节忽略) 二.参数: 1.window.open参数解释: /* *常用参数:   1.page.html' 弹出窗口的文件名:    2.newwindow' 弹出窗口的名字(不是文件名),非必须,可用空''代替:      3.hight=100 窗口高度:      4.width=400 窗口宽度:

IOS SDK详解之UIAlertController(IOS8之后替代AlertView和ActionSheet)

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 前言:有两个月左右没为公司开发IOS项目了(最近一直在搞IOT),以至于对IOS 8的这个更新都没看到.这里补上. 一 概述 在IOS8之后,UIAlertController替代了UIActionSheet和UIAlertView.把两种类型的提示信息放到这一个类里来实现. 注意, 这个class不能通过继承的方式来自定义. 二 类介绍 先举两个使用的例子 例子一 UIAlertController * alertC

转 :2016HTML5移动端最新兼容问题解决方案;

1.安卓浏览器看背景图片,有些设备会模糊.用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢?经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显示网页,这样字会非常小,所以苹果当初就把iPhone 4的960640分辨率,在网页里只显示了480320,这样devicePixelRatio=2.现在android比较乱,有1.5的,有2的也有3的.让图片在手机里显示更为清晰,必须使用2x的背景图来代替img标签(一般情况都是用2倍).例如一个di

location.origin不兼容IE8解决方案

最近项目中遇到一个问题,在ajax跟后台交互时需要传一个全路径url.项目上线后,在谷歌,火狐,360等浏览器访问一切正常.但唯独IE8下出现问题,提示url:undefined ! 这就尴尬了!!!原来是location.origin不兼容IE8!!! 万恶的兼容性问题, 最终解决方案如下: 1 var baseUrl; 2 if (typeof location.origin === 'undefined') 3 { 4 baseUrl = location.protocol + '//'

【转】HTML5移动端最新兼容问题解决方案

1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显示网页,这样字会非常小,所以苹果当初就把iPhone 4的960640分辨率,在网页里只显示了480320,这样devicePixelRatio=2.现在android比较乱,有1.5的,有2的也有3的.让图片在手机里显示更为清晰,必须使用2x的背景图来代替img标签(一般情况都是用2倍).例如一个

HTML5移动端最新兼容问题解决方案

1.安卓浏览器看背景图片,有些设备会模糊.用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢?经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显示网页,这样字会非常小,所以苹果当初就把iPhone 4的960640分辨率,在网页里只显示了480320,这样devicePixelRatio=2.现在android比较乱,有1.5的,有2的也有3的.想让图片在手机里显示更为清晰,必须使用2x的背景图来代替img标签(一般情况都是用2倍).例如一个d

【IE兼容问题】记一次因为jquery版本不同导致的兼容问题解决方案X-UA-Compatible

最近在调试一个jquery插件Manifest 测试过程中发现IE一直不能完全展示这个插件,只显示了一个textbox文本框 IE下的bug的效果图 其他浏览器正常的效果图 跟踪原因,IE下jquery版本不兼容,有报错 SCRIPT3: 找不到成员. 什么鬼,找不到跟我有什么关系,MD 找不到,你还不赶紧去找,SB IE,莫非是让我去找啊 最后用下面的解决方案 head最前面添加的meta标签 <meta charset="utf-8" http-equiv="X-U

关于iReport5.6.0无法正常启动或者闪退或者JDK8不兼容的解决方案

参考网址: https://blog.csdn.net/erlian1992/article/details/76359191?locationNum=6&fps=1 说白了 ,即 jasperReport不兼容 jdk1.8以上,两种解决方案 重新安装jdk,1.8版本一下,重新设置JAVA_HOMT 多安装一个 jdk1.8以下版本,修改 etc目录下的 ireport.conf 文件,设置其 jdk_homt即可 ,注意该路径不包括到jdk的bin目录,例如 jdkhome="E: