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

iOS开发 提示框UIAlertController的略微封装

2016-08-29 14:07 423 查看
之前写的代码,把UIAlertView的封装剔除之后,发现UIAlertController 封装的意义不是很大了,毕竟苹果公司封装的已经够好了,好了,上代码

//
//  XSDAlertViewTools.h
//  XSDSH  提示框工具类
//
//  Created by 小广 on 16/1/11.
//  Copyright © 2016年 XSD. All rights reserved.
//

#import <Foundation/Foundation.h>

#define cancelIndex    (-1)

typedef void(^AlertViewBlock)(NSInteger buttonTag);

@interface XSDAlertViewTools : NSObject

+ (XSDAlertViewTools *)shareInstance;

/**
*  创建提示框
*
*  @param title        标题
*  @param message      提示内容
*  @param cancelTitle  取消按钮(无操作,为nil则只显示一个按钮)
*  @param titleArray   标题字符串数组(为nil,默认为"确定")
*  @param vc           VC iOS8及其以后会用到
*  @param confirm      点击按钮的回调(取消按钮的Index是cancelIndex -1)
*/
- (void)showAlert:(NSString *)title
message:(NSString *)message
cancelTitle:(NSString *)cancelTitle
titleArray:(NSArray *)titleArray
viewController:(UIViewController *)vc
confirm:(AlertViewBlock)confirm;

/**
*  创建提示框(可变参数版)
*
*  @param title        标题
*  @param message      提示内容
*  @param cancelTitle  取消按钮(无操作,为nil则只显示一个按钮)
*  @param vc           VC iOS8及其以后会用到
*  @param confirm      点击按钮的回调(取消按钮的Index是cancelIndex -1)
*  @param buttonTitles 按钮(为nil,默认为"确定",传参数时必须以nil结尾,否则会崩溃)
*/
- (void)showAlert:(NSString *)title
message:(NSString *)message
cancelTitle:(NSString *)cancelTitle
viewController:(UIViewController *)vc
confirm:(AlertViewBlock)confirm
buttonTitles:(NSString *)buttonTitles, ... NS_REQUIRES_NIL_TERMINATION;

/**
*  创建菜单(Sheet)
*
*  @param title        标题
*  @param message      提示内容
*  @param cancelTitle  取消按钮(无操作,为nil则只显示一个按钮)
*  @param titleArray   标题字符串数组(为nil,默认为"确定")
*  @param vc           VC iOS8及其以后会用到
*  @param confirm      点击确认按钮的回调(取消按钮的Index是cancelIndex -1)
*/
- (void)showSheet:(NSString *)title
message:(NSString *)message
cancelTitle:(NSString *)cancelTitle
titleArray:(NSArray *)titleArray
viewController:(UIViewController *)vc
confirm:(AlertViewBlock)confirm;

/**
*  创建菜单(Sheet 可变参数版)
*
*  @param title        标题
*  @param message      提示内容
*  @param cancelTitle  取消按钮(无操作,为nil则只显示一个按钮)
*  @param vc           VC
*  @param confirm      点击按钮的回调(取消按钮的Index是cancelIndex -1)
*  @param buttonTitles 按钮(为nil,默认为"确定",传参数时必须以nil结尾,否则会崩溃)
*/
- (void)showSheet:(NSString *)title
message:(NSString *)message
cancelTitle:(NSString *)cancelTitle
viewController:(UIViewController *)vc
confirm:(AlertViewBlock)confirm
buttonTitles:(NSString *)buttonTitles, ... NS_REQUIRES_NIL_TERMINATION ;

@end


.m里
//
//  XSDAlertViewTools.m
//  XSDSH  提示框工具类
//
//  Created by 小广 on 16/1/11.
//  Copyright © 2016年 XSD. All rights reserved.
//

#import "XSDAlertViewTools.h"

#define RootVC  [[UIApplication sharedApplication] keyWindow].rootViewController

@interface XSDAlertViewTools ()

@property (nonatomic, copy) AlertViewBlock block;

@end

@implementation XSDAlertViewTools

#pragma mark - 对外方法
+ (XSDAlertViewTools *)shareInstance {
static XSDAlertViewTools *tools = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
tools = [[self alloc] init];
});
return tools;
}

/**
*  创建提示框
*
*  @param title        标题
*  @param message      提示内容
*  @param cancelTitle  取消按钮(无操作,为nil则只显示一个按钮)
*  @param titleArray   标题字符串数组(为nil,默认为"确定")
*  @param vc           VC
*  @param confirm      点击确认按钮的回调
*/
- (void)showAlert:(NSString *)title
message:(NSString *)message
cancelTitle:(NSString *)cancelTitle
titleArray:(NSArray *)titleArray
viewController:(UIViewController *)vc
confirm:(AlertViewBlock)confirm {
//
if (!vc) vc = RootVC;

[self p_showAlertController:title message:message
cancelTitle:cancelTitle titleArray:titleArray
viewController:vc confirm:^(NSInteger buttonTag) {
if (confirm)confirm(buttonTag);
}];
}

/**
*  创建提示框(可变参数版)
*
*  @param title        标题
*  @param message      提示内容
*  @param cancelTitle  取消按钮(无操作,为nil则只显示一个按钮)
*  @param vc           VC
*  @param confirm      点击按钮的回调
*  @param buttonTitles 按钮(为nil,默认为"确定",传参数时必须以nil结尾,否则会崩溃)
*/
- (void)showAlert:(NSString *)title
message:(NSString *)message
cancelTitle:(NSString *)cancelTitle
viewController:(UIViewController *)vc
confirm:(AlertViewBlock)confirm
buttonTitles:(NSString *)buttonTitles, ... NS_REQUIRES_NIL_TERMINATION {

// 读取可变参数里面的titles数组
NSMutableArray *titleArray = [[NSMutableArray alloc] initWithCapacity:0];
va_list list;
if(buttonTitles) {
//1.取得第一个参数的值(即是buttonTitles)
[titleArray addObject:buttonTitles];
//2.从第2个参数开始,依此取得所有参数的值
NSString *otherTitle;
va_start(list, buttonTitles);
while ((otherTitle = va_arg(list, NSString*))) {
[titleArray addObject:otherTitle];
}
va_end(list);
}

if (!vc) vc = RootVC;

[self p_showAlertController:title message:message
cancelTitle:cancelTitle titleArray:titleArray
viewController:vc confirm:^(NSInteger buttonTag) {
if (confirm)confirm(buttonTag);
}];

}

/**
*  创建菜单(Sheet)
*
*  @param title        标题
*  @param message      提示内容
*  @param cancelTitle  取消按钮(无操作,为nil则只显示一个按钮)
*  @param titleArray   标题字符串数组(为nil,默认为"确定")
*  @param vc           VC
*  @param confirm      点击确认按钮的回调
*/
- (void)showSheet:(NSString *)title
message:(NSString *)message
cancelTitle:(NSString *)cancelTitle
titleArray:(NSArray *)titleArray
viewController:(UIViewController *)vc
confirm:(AlertViewBlock)confirm {

if (!vc) vc = RootVC;

[self p_showSheetAlertController:title message:message cancelTitle:cancelTitle
titleArray:titleArray viewController:vc confirm:^(NSInteger buttonTag) {
if (confirm)confirm(buttonTag);
}];
}

/**
*  创建菜单(Sheet 可变参数版)
*
*  @param title        标题
*  @param message      提示内容
*  @param cancelTitle  取消按钮(无操作,为nil则只显示一个按钮)
*  @param vc           VC iOS8及其以后会用到
*  @param confirm      点击按钮的回调
*  @param buttonTitles 按钮(为nil,默认为"确定",传参数时必须以nil结尾,否则会崩溃)
*/
- (void)showSheet:(NSString *)title
message:(NSString *)message
cancelTitle:(NSString *)cancelTitle
viewController:(UIViewController *)vc
confirm:(AlertViewBlock)confirm
buttonTitles:(NSString *)buttonTitles, ... NS_REQUIRES_NIL_TERMINATION {
// 读取可变参数里面的titles数组
NSMutableArray *titleArray = [[NSMutableArray alloc] initWithCapacity:0];
va_list list;
if(buttonTitles) {
//1.取得第一个参数的值(即是buttonTitles)
[titleArray addObject:buttonTitles];
//2.从第2个参数开始,依此取得所有参数的值
NSString *otherTitle;
va_start(list, buttonTitles);
while ((otherTitle= va_arg(list, NSString*))) {
[titleArray addObject:otherTitle];
}
va_end(list);
}

if (!vc) vc = RootVC;

// 显示菜单提示框
[self p_showSheetAlertController:title message:message cancelTitle:cancelTitle
titleArray:titleArray viewController:vc confirm:^(NSInteger buttonTag) {
if (confirm)confirm(buttonTag);
}];

}

#pragma mark - ----------------内部方法------------------

//UIAlertController(iOS8及其以后)
- (void)p_showAlertController:(NSString *)title
message:(NSString *)message
cancelTitle:(NSString *)cancelTitle
titleArray:(NSArray *)titleArray
viewController:(UIViewController *)vc
confirm:(AlertViewBlock)confirm {

UIAlertController  *alert = [UIAlertController alertControllerWithTitle:title
message:message
preferredStyle:UIAlertControllerStyleAlert];
// 下面两行代码 是修改 title颜色和字体的代码
//    NSAttributedString *attributedMessage = [[NSAttributedString alloc] initWithString:title attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17.0f], NSForegroundColorAttributeName:UIColorFrom16RGB(0x334455)}];
//    [alert setValue:attributedMessage forKey:@"attributedTitle"];
if (cancelTitle) {
// 取消
UIAlertAction  *cancelAction = [UIAlertAction actionWithTitle:cancelTitle
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * _Nonnull action) {
if (confirm)confirm(cancelIndex);
}];
[alert addAction:cancelAction];
}
// 确定操作
if (!titleArray || titleArray.count == 0) {
UIAlertAction  *confirmAction = [UIAlertAction actionWithTitle:@"确定"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
if (confirm)confirm(0);
}];

[alert addAction:confirmAction];
} else {

for (NSInteger i = 0; i<titleArray.count; i++) {
UIAlertAction  *action = [UIAlertAction actionWithTitle:titleArray[i]
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
if (confirm)confirm(i);
}];
// [action setValue:UIColorFrom16RGB(0x00AE08) forKey:@"titleTextColor"]; // 此代码 可以修改按钮颜色
[alert addAction:action];
}
}

[vc presentViewController:alert animated:YES completion:nil];

}

// ActionSheet的封装
- (void)p_showSheetAlertController:(NSString *)title
message:(NSString *)message
cancelTitle:(NSString *)cancelTitle
titleArray:(NSArray *)titleArray
viewController:(UIViewController *)vc
confirm:(AlertViewBlock)confirm {

UIAlertController *sheet = [UIAlertController alertControllerWithTitle:title
message:message
preferredStyle:UIAlertControllerStyleActionSheet];
if (!cancelTitle) cancelTitle = @"取消";
// 取消
UIAlertAction  *cancelAction = [UIAlertAction actionWithTitle:cancelTitle
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * _Nonnull action) {
if (confirm)confirm(cancelIndex);
}];
[sheet addAction:cancelAction];

if (titleArray.count > 0) {
for (NSInteger i = 0; i<titleArray.count; i++) {
UIAlertAction  *action = [UIAlertAction actionWithTitle:titleArray[i]
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
if (confirm)confirm(i);
}];
[sheet addAction:action];
}
}

[vc presentViewController:sheet animated:YES completion:nil];
}

@end


用法:

// 通常的alert
[[XSDAlertViewTools shareInstance] showAlert:@"提示"
message:@"这个就是提示的内容了"
cancelTitle:@"取消"
titleArray:@[@"确定"]
viewController:nil
confirm:^(NSInteger buttonTag) {
// cancel按钮的index(buttonTag)是-1 cancelIndex
NSLog(@"点击按钮的buttonTag===%ld==",(long)buttonTag);
}];
// 带有可变参数的alert
[[XSDAlertViewTools shareInstance] showAlert:@"提示"
message:@"这个就是提示的内容了"
cancelTitle:@"取消"
viewController:self
confirm:^(NSInteger buttonTag) {
// cancel按钮的index(buttonTag)是-1 cancelIndex
NSLog(@"点击按钮的buttonTag===%ld==",(long)buttonTag);

} buttonTitles:@"呼叫",@"查看",@"我就看看", nil];

如图:alert 和sheet


  



比较low,大家凑合着看吧...其中的sheet的用法,和上面的alert一样;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: