iOS UIAlertController 用法介绍

原文:https://www.jianshu.com/p/b72753c51b39

UIAlertController
UIAlertController的用法很简单,我们却经常使用.它用以取代iOS 8.0 之前的UIAlertView和UIActionSheet.

  1. UIAlertViewController 是一个ViewController.不同于之前的UIAlertView是继承自UIView.

同使用UIKit中其他Controller一样,使用它,首先得获取一个UIAlertController类型的对象.这是第一步.

//获取alertController对象
+ (instancetype)alertControllerWithTitle:(nullable NSString *)title message:(nullable NSString *)message preferredStyle:(UIAlertControllerStyle)preferredStyle;
//添加action
- (void)addAction:(UIAlertAction *)action; 

1.1 获取UIAlertController对象:通过使用UIAlertController类的快速构建方法+ (instancetype)alertControllerWithTitle:(nullable NSString *)title message:(nullable NSString *)message preferredStyle:(UIAlertControllerStyle)preferredStyle;需要传入三个参数,类型为NSString的title 和 message, 以及确定UIAlertControllerStyle的参数.
注意:这是唯一的获取UIAlertController对象的方法. 尽管你可以使用父类UIViewController的初始化方法,但是UIAlertController有个属性是不可以写入的,只能通过快速创建方法获取对象的时候传入参数来确定.下面是这个属性:

 @property (nonatomic, readonly) UIAlertControllerStyle preferredStyle; 
  • 看看参数title, message是什么?确定传入参数

代码:

-(UIAlertController*)alertVC
{
    if (!_alertVC) {
        _alertVC = [UIAlertController alertControllerWithTitle:@"alertVCTitle" message:@"alertVCMessage" preferredStyle:UIAlertControllerStyleAlert];
    }
    
    return _alertVC;
} 

显示结果:

参数的显示位置

  • alertViewController的Style参数
    第三个参数是Style参数,传入参数以确定显示的alertController的样式.
    看看都有什么样式:
 >typedef NS_ENUM(NSInteger, UIAlertControllerStyle) {
    UIAlertControllerStyleActionSheet = 0,
    UIAlertControllerStyleAlert
} NS_ENUM_AVAILABLE_IOS(8_0); 

StyleAlert样式

StyleActionSheet样式

当设置StyleActionSheet 这款样式的时候,这时候,alertController的view会从屏幕底部弹出,而宽和屏幕的宽差不多.不像StyleAlert样式是从屏幕中央出现.

  1. 使用UIAlertView
    使用UIAlerView我们使用对象初始化方法来创建view对象和添加view上面的Button:
- (instancetype)initWithTitle:(nullable NSString *)title message:(nullable NSString *)message delegate:(nullable id /*<UIAlertViewDelegate>*/)delegate cancelButtonTitle:(nullable NSString *)cancelButtonTitle otherButtonTitles:(nullable NSString *)otherButtonTitles, ... 

- (NSInteger)addButtonWithTitle:(nullable NSString *)title;    // returns index of button. 0 based.
- (nullable NSString *)buttonTitleAtIndex:(NSInteger)buttonIndex;
//代理方法
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 

也可以额外添加alertView上面的Button,并通过初始化时候设置的代理来处理点击事件,这里不同的Button 是通过**编号(buttonIndex)**来区分的.代理通过实现协议方法来处理不同按钮的点击事件.
UIAertController 和 UIAlertView不同,是通过它的一个对象方法- (void)addAction:(UIAlertAction *)action; 添加UIAlertAction对象,来实现按钮的Style定制(其实也没啥外观可以定制的,就是加粗字体,设置字体颜色). UIAlertController是通过使用其对象方法:addAction:(UIAlertAction *)action;向其添加action对象来添加按钮和处理按钮点击事件的.

2.1 在UIAlertController中添加按钮
首先创建按钮(也就是UIAlertAction),在创建按钮的同时其点击事件也一并确定了.

+ (instancetype)actionWithTitle:(nullable NSString *)title style:(UIAlertActionStyle)style handler:(void (^ __nullable)(UIAlertAction *action))handler; 

Style:根据不同Style的,Title的颜色和字体会有所变化. UIAlertActionStyleDefault = 0, UIAlertActionStyleCancel, UIAlertActionStyleDestructive的样式在上图actionSheet中都有标注.
handler:即所创建action对象的事件Block.当点击所对应的actionButton的时候,Block 被调用. Block 可为空, 返回值为void, 传入对象本身作为参数.最后把定义的action对象 通过alertController对象的addAction方法添加至对象即可. 当alertController的Style为alertStyle的时候,添加action多余三个的时候,会从上之下排列.

代码

//依次创建不同样式的按钮和对应的事件Block,并添加到alertController对象上.
    UIAlertAction* actionDefault = [UIAlertAction actionWithTitle:@"Default" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"titleOne is pressed");
    }];
    
    UIAlertAction* actionDestructive = [UIAlertAction actionWithTitle:@"Destructive" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"titleTwo is pressed");
    }];
    
    UIAlertAction* actionCancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"titleThree is pressed");
    }];
    [self.alertVC addAction:actionDefault];
    [self.alertVC addAction:actionDestructive];
    [self.alertVC addAction:actionCancel]; 

显示结果:

不同样式的action

  1. 添加输入框
- (void)addTextFieldWithConfigurationHandler:(void (^ __nullable)(UITextField *textField))configurationHandler;
@property (nullable, nonatomic, readonly) NSArray<UITextField *> *textFields; 

通过上面的方法可以在alertController上面添加一个输入框, 需要一个Block 参数.该Block类型也有一个参数.为当前添加的textField.
这是一个配置textField的Block,不可以在该Block中获取textField中的值.可以向其中添加多个textField,在alertController中有一个数组,通过这个数组,我们可以获取添加到alertController上面的textField;
textField数组:

@property (nullable, nonatomic, readonly) NSArray<UITextField *> *textFields; 
  • 向alertController上添加textFields.
    代码
 [_alertVC addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        // This is Configure Handler Block Just For textField's Configuration after call this method...
        textField.text = @"hello";
        //不要在这里面做一些,获取textField内容的操作,像这样
//        NSLog(@"%@",textField.text);//禁止这样做.这是一个配置Block.
    }]; 

我们可以在上面的Default按钮点击的时候,获取textField.

UIAlertAction* actionDefault = [UIAlertAction actionWithTitle:@"Default" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"textField text is %@",[_alertVC.textFields firstObject].text);
    }]; 

显示结果:

显示输入框,输入框中的值是配置的,当点击Default按钮时会log:hello

动手试了试,只能向alertStyle 类型的alertController添加输入框.alertController提供的接口很少,最近用alertView总是报警告,详细的把alertController的看了一遍.还是用官方推荐的.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值