美文网首页
UIAlertController

UIAlertController

作者: dominghao | 来源:发表于2018-01-27 14:02 被阅读49次

    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的看了一遍.还是用官方推荐的.

    相关文章

      网友评论

          本文标题:UIAlertController

          本文链接:https://www.haomeiwen.com/subject/dkjnaxtx.html