您的位置:首页 > 产品设计 > UI/UE

UIAlertView及UIAlertController在不同系统版本中的自适配

2015-11-06 10:19 423 查看
iOS8.0之后,苹果新推出了一种弹框提醒UIAlertController来替代UIAlertView,这也为我们挖了一些坑。

比如我就曾与到在8.3系统上,在键盘弹出正在输入的模式下,此时如果点返回按钮的情况下,使用UIAlertView弹框提示用户是否确定返回(为UINavigationController模式下),此时当返回到上个界面之后,键盘会从左至右一闪而过。

还有就是比如我们在一个imageView上添加了弹框事件,提示内容为“查看大图,取消”,此时如果我们在如下点击方法内去把大图添加到[UIApplication sharedApplication].keyWindow上面,那么会在alertView消失的时候,连同我们的大图一起从window上移除。 这情况就是在8.0之上系统使用UIAlertView 出现的。

资源链接:http://download.csdn.net/detail/longitachi/9246645

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


那么我们需要自定义一个类,去实现在不同的系统下,自动选择使用哪种控件去完成所需操作

该类.h如下

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

typedef void (^ClickAction)();

@interface ZLAlertView : NSObject

@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *message;

/**
* @param title    标题
* @param message  提示内容
*/
- (instancetype)initWithTitle:(NSString *)title message:(NSString *)message;

- (void)setTitle:(NSString *)title message:(NSString *)message;

/**
* @brief 添加按钮及事件,多个按钮便多次调用,按钮按照添加顺序显示
*/
- (void)addBtnTitle:(NSString *)title action:(ClickAction)action;

/**
* @brief 显示提示框
*/
- (void)showAlertWithSender:(UIViewController *)sender;

NS_ASSUME_NONNULL_END

@end


.m实现如下
#import "ZLAlertView.h"

#define iOS8_0 [[[UIDevice currentDevice] systemVersion] doubleValue] >= 8.0

@interface ZLAlertView () <UIAlertViewDelegate>
{
NSMutableArray *_arrayTitles;
NSMutableArray *_arrayActions;
}

//iOS8.0之后会使用UIAlertController,所以需要使用调用该类的ViewController
@property (nonatomic, weak) UIViewController *sender;

@end

@implementation ZLAlertView

//重写该方法,保证该对象不会被释放,如果被释放,iOS8以下的UIAlertView的回调时候会崩溃
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
static ZLAlertView *_shareAlertView = nil;
dispatch_once(&onceToken, ^{
if (_shareAlertView == nil) {
_shareAlertView = [super allocWithZone:zone];
}
});
return _shareAlertView;
}

- (instancetype)init
{
if (self = [super init]) {
_arrayTitles = [NSMutableArray array];
_arrayActions = [NSMutableArray array];
}
return self;
}

- (instancetype)initWithTitle:(NSString *)title message:(NSString *)message
{
if ([self init]) {
_title = title;
_message = message;
}
return self;
}

- (void)setTitle:(NSString *)title message:(NSString *)message
{
_title = title;
_message = message;
}

- (void)addBtnTitle:(NSString *)title action:(ClickAction)action
{
[_arrayTitles addObject:title];
[_arrayActions addObject:action];
}

- (void)showAlertWithSender:(UIViewController *)sender
{
if (_arrayTitles.count == 0) {
return;
}
self.sender = sender;
if (iOS8_0) {
[self showAlertController];
} else {
[self showAlertView];
}
}

- (void)showAlertController
{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:_title message:_message preferredStyle:UIAlertControllerStyleAlert];
for (int i = 0; i < _arrayTitles.count; i++) {
UIAlertAction *action = [UIAlertAction actionWithTitle:_arrayTitles[i] style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
ClickAction ac = _arrayActions[i];
ac();
}];
[alert addAction:action];
}
if (_sender) {
[_sender showDetailViewController:alert sender:nil];
}
}

- (void)showAlertView
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:_title message:_message delegate:self cancelButtonTitle:nil otherButtonTitles: nil];
for (NSString *title in _arrayTitles) {
[alert addButtonWithTitle:title];
}

[alert show];
}

#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
ClickAction action = _arrayActions[buttonIndex];
action();
}

@end


使用方法如下

#import "ZLAlertView.h"
ZLAlertView *alert = [[ZLAlertView alloc] initWithTitle:@"提示" message:@"alertView"];
[alert addBtnTitle:@"first" action:^{
NSLog(@"click first");
}];
[alert addBtnTitle:@"second" action:^{
NSLog(@"click second");
}];
[alert showAlertWithSender:self];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: