UIAlertController
UIAlertController的用法很简单,我们却经常使用.它用以取代iOS 8.0 之前的UIAlertView和UIActionSheet.
- 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样式是从屏幕中央出现.
-
使用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- 添加输入框
- (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的看了一遍.还是用官方推荐的.
网友评论