用block将UIAlertView与UIActionSheet统一起来

用block将UIAlertView与UIActionSheet统一起来

 

效果

 

1. 将代理方法的实例对象方法转换成了类方法使用

2. 要注意单例block不要长期持有,用完就释放掉

 

源码

https://github.com/YouXianMing/UIInfomationView

//
//  UIInfomationView.h
//  Alert
//
//  Created by YouXianMing on 15/6/23.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

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

typedef void (^ClickAtIndexBlock)(NSInteger buttonIndex);

@interface UIInfomationView : NSObject 

/**
 *  弹出AlertView对话框
 *
 *  @param title             标题
 *  @param message           信息
 *  @param cancelButtonTitle 取消按钮
 *  @param otherButtons      其他按钮
 *  @param clickAtIndex      获取点击信息的block(进入block中的对象请用weak修饰,否则会导致被block持有)
 *
 *  @return AlertView对象
 */
+ (UIAlertView *)showAlertViewWithTitle:(NSString *)title
                                message:(NSString *)message
                      cancelButtonTitle:(NSString *)cancelButtonTitle
                      otherButtonTitles:(NSArray *)otherButtons
                           clickAtIndex:(ClickAtIndexBlock)clickAtIndex;

/**
 *  弹出ActionSheet对话框
 *
 *  @param view              要显示的view
 *  @param title             标题
 *  @param cancelButtonTitle 取消按钮
 *  @param destructiveButton destructive按钮
 *  @param otherButtons      其他按钮
 *  @param clickAtIndex      获取点击信息的block(进入block中的对象请用weak修饰,否则会导致被block持有)
 *
 *  @return ActionSheet对象
 */
+ (UIActionSheet *)showActionSheetInView:(UIView *)view
                               WithTitle:(NSString *)title
                       cancelButtonTitle:(NSString *)cancelButtonTitle
                  destructiveButtonTitle:(NSString *)destructiveButton
                       otherButtonTitles:(NSArray *)otherButtons
                            clickAtIndex:(ClickAtIndexBlock)clickAtIndex;

@end
//
//  UIInfomationView.m
//  Alert
//
//  Created by YouXianMing on 15/6/23.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "UIInfomationView.h"
#import <UIKit/UIKit.h>

/**
 *  让类方法中的对象被持有
 */
static ClickAtIndexBlock _clickAtIndexBlock;

@interface UIInfomationView () <UIActionSheetDelegate, UIAlertViewDelegate>

@end

@implementation UIInfomationView

+ (UIAlertView *)showAlertViewWithTitle:(NSString *)title
                                message:(NSString *)message
                      cancelButtonTitle:(NSString *)cancelButtonTitle
                      otherButtonTitles:(NSArray *)otherButtons
                           clickAtIndex:(ClickAtIndexBlock)clickAtIndex {

    _clickAtIndexBlock = [clickAtIndex copy];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
                                                    message:message
                                                   delegate:self
                                          cancelButtonTitle:cancelButtonTitle
                                          otherButtonTitles:nil];

    for(NSString *buttonTitle in otherButtons) {
        [alert addButtonWithTitle:buttonTitle];
    }

    [alert show];
    return alert;
}

+ (UIActionSheet *)showActionSheetInView:(UIView *)view
                               WithTitle:(NSString *)title
                       cancelButtonTitle:(NSString *)cancelButtonTitle
                  destructiveButtonTitle:(NSString *)destructiveButton
                       otherButtonTitles:(NSArray *)otherButtons
                            clickAtIndex:(ClickAtIndexBlock)clickAtIndex {

    _clickAtIndexBlock = [clickAtIndex copy];

    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:title
                                                       delegate:[self self]
                                              cancelButtonTitle:cancelButtonTitle
                                         destructiveButtonTitle:destructiveButton
                                              otherButtonTitles:nil];

    for(NSString *buttonTitle in otherButtons) {
        [sheet addButtonWithTitle:buttonTitle];
    }

    [sheet showInView:view];
    return sheet;
}

#pragma mark - alertView代理
+ (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

    _clickAtIndexBlock(buttonIndex);
}

+ (void)alertView:(UIAlertView*)alertView didDismissWithButtonIndex:(NSInteger) buttonIndex {

    _clickAtIndexBlock = nil;
}

#pragma mark - actionSheetView代理
+ (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

    _clickAtIndexBlock(buttonIndex);
}

+ (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {

    _clickAtIndexBlock = nil;
}

@end

注意

时间: 2024-12-04 20:28:32

用block将UIAlertView与UIActionSheet统一起来的相关文章

UIAlertView和UIActionSheet

UIAlertView和UIActionSheet是iOS自带的弹出式对话框.当这俩个控件出现时,用户无法与其他控件进行交互. 两个区别在于: UIAlertView是显示在屏幕中央的,而UIActionSheet是显示在底部的按钮列表. UIAlertView的用法非常简单: 1.创建UIAlertView,指定该对话框的标题.消息内容.以及该对话框包含的按钮信息.如果要监听按钮点击警告框的哪个按钮,需要设置UIAlertViewDelegate委托对象. 2.显示UIAlertView即可.

iOS 8 中 UIAlertView 和 UIActionSheet 河里去了?

iOS 8 中 UIAlertView 和 UIActionSheet 河里去了? 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 弃用了! 现在得用 UIAlertController 了.

2013-8-12练习[制作一个具有UIAlertView和UIActionSheet的登陆界面]

创建登陆窗口(有用户名和密码),确认后弹出对话框再输入一遍,如果都相同,显示用户图片,如果不相同,弹出上拉菜单(UIActionSheet),问是否重新输入,是的话弹出对话框重新输入. 效果图: viewController.h: // // DXWViewController.h // 2013-8-12作业 // // Created by 丁小未 on 13-8-12. // Copyright (c) 2013年 dingxiaowei. All rights reserved. //

iOS8统一的系统提示控件——UIAlertController

iOS8统一的系统提示控件--UIAlertController 一.引言         相信在iOS开发中,大家对UIAlertView和UIActionSheet一定不陌生,这两个控件在UI设计中发挥了很大的作用.然而如果你用过,你会发现这两个控件的设计思路有些繁琐,通过创建设置代理来进行界面的交互,将代码逻辑分割了,并且很容易形成冗余代码.在iOS8之后,系统吸引了UIAlertController这个类,整理了UIAlertView和UIActionSheet这两个控件,在iOS中,如

UIKit 框架之UIActionSheet

UIAlertView和UIActionSheet相似,区别很小, 很容易理解. // // ViewController.m // UIActionSheet // // Created by City--Online on 15/5/18. // Copyright (c) 2015年 XQB. All rights reserved. // #import "ViewController.h" @interface ViewController ()<UIActionShe

VNX Block OE 05.32支持硬件升级准备检查的介绍

升级准备检查向导   升级准备检查(Upgrade Readiness Checker)是USM (Unisphere Service Manager)中新增的向导.只需要导入源设备的配置文件,即可导出TXT格式的报告.如果存储系统暂不适合升级,报告中会注明详细的原因和解决方案.   · 升级准备检查向导为下面三种升级做准备   · 从低端型号升级到高端型号   · 从单一数据块存储(Block Only)升级成统一存储(Unified)   · VNX7500内存从24GB升级到48GB  

ReactiveCocoa代码实践之-UI组件的RAC信号操作_Android

相关阅读: ReactiveCocoa代码实践之-更多思考 ReactiveCocoa代码实践之-RAC网络请求重构这一节是自己对网络层的一些重构,本节是自己一些代码小实践做出的一些demo程序,基本涵盖大多数UI控件操作. 一.用UISlider实现调色板 假设我们现在做一个demo,上面有一个View用来展示颜色,下面有三个UISlider滑竿分别控制RGB的色值,随着不同滑竿的拖动上面view的颜色会随之改变. 可以先脑补一下不用RAC该怎么写. 如果使用RAC只需要将三个信号包装起来用适

WWDC 2014 Session笔记 - iOS界面开发的大一统

本文是我的 WWDC 2014 笔记 中的一篇,涉及的 Session 有 What's New in Cocoa Touch Building Adaptive Apps with UIKit What's New in Interface Builder View Controller Advancements in iOS 8 A Look Inside Presentation Controllers iOS 8 和 OS X 10.10 中一个被强调了多次的主题就是大一统,Apple

ReactiveCocoa代码实践之-UI组件的RAC信号操作

相关阅读: ReactiveCocoa代码实践之-更多思考 ReactiveCocoa代码实践之-RAC网络请求重构这一节是自己对网络层的一些重构,本节是自己一些代码小实践做出的一些demo程序,基本涵盖大多数UI控件操作. 一.用UISlider实现调色板 假设我们现在做一个demo,上面有一个View用来展示颜色,下面有三个UISlider滑竿分别控制RGB的色值,随着不同滑竿的拖动上面view的颜色会随之改变. 可以先脑补一下不用RAC该怎么写. 如果使用RAC只需要将三个信号包装起来用适