创建模态提醒窗口(UIAlertView)

UIAlertView类创建一个简单的模态提醒窗口,可能包含消息、按钮以及文本框。模态UI元素要求用户必须与之交互(通常是按下按钮)后才能做其它事情。它们通常位于其他窗口前面,在可见时禁止用户与其他任何界面元素交互。

UIAlertView的初始化代码如下:

- (void)testAlert
{
    UIAlertView *alertView = [[UIAlertView alloc] 
                              initWithTitle:@"系统警告" 
                              message:@"您的电量不足,将在10分钟后关机"
                              delegate:nil
                              cancelButtonTitle:@""
                              otherButtonTitles:nil];
    alertView.alertViewStyle = UIAlertViewStyleDefault;
    [alertView show];
}

调用该方法后,会产生如下界面:

参数说明:
initWithTitle --- 初始化提醒视图并设置出现在提醒视图顶端的标题。
message --- 详细文本描述
delegate --- 用来响应提醒的对象。如果不需要执行任何操作,可设置为nil
cancelButtonTitle --- 视图中默认按钮的标题
otherButtonTitles --- 视图中额外按钮的标题,是一个数组,以nil结尾

alertView.alertViewStyle用来定义提醒视图的外观,有4种方案可供选择:
UIAlertViewStyleDefault --- 没有设置样式时默认采用的样式,不包含输入文本框
UIAlertViewStylePlainTextInput --- 添加一个常规输入文本框
UIAlertViewStyleSecureTextInput --- 添加一个安全(密码)文本框
UIAlertViewStyleLoginAndPasswordInput --- 添加一个常规文本框和密码文本框

需要着重了解的是delegate这个参数,它指明了由哪个类来响应用户的操作或读取文本框的内容。响应类必须遵守协议UIAlertViewDelegate并实现方法alertView:clickedButtonAtIndex,一般会指定为self。

首先在类的头文件(.h)里声明为遵守UIAlertViewDelegate协议

@interface ViewController : UIViewController <UIAlertViewDelegate>

然后实现方法alertView:clickedButtonAtIndex

- (IBAction)testUIAlertView:(id)sender 
{
    UIAlertView *alertView = [[UIAlertView alloc] 
                             initWithTitle:@"新版本提示" 
                             message:@"该程序有一个新版本,是否升级?" 
                             delegate:self 
                             cancelButtonTitle:@"忽略" 
                             otherButtonTitles:@"现在升级", nil];
    [alertView show];
}
                              
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSLog(@"点击按钮的索引是:%d,标题是:%@",buttonIndex,[alertView buttonTitleAtIndex:buttonIndex]);
    if([alertView.title isEqualToString:@"Input your Email"])
    {
        NSLog(@"这个窗口是Email输入提示!");
    }
}

buttonTitleAtIndex方法是根据按钮的索引来取得按钮的标题。假如提醒框里含有输入框,则可以用textFieldAtIndex来获得该TextField实例,例如:

[[alertView textFieldAtIndex:0] text];

也可以自定义一个类来作为UIAlertView实例的delegate,一样的先声明为遵守UIAlertViewDelegate协议,然后将delegate设置为新建类的实例就可以了。但有一点一定要注意,在启用ARC后,实例变量的生存周期只存在于所属方法内部,这里是一个按钮的点击动作,当点击按钮弹出提醒框后,该代理类的引用已经被自动清除掉了,所以当你视图去点击提醒框按钮来触发alertView:clickedButtonAtIndex方法,会出现错误。这里最简单的解决方法是将变量声明为全局变量。下面的例子演示了这个问题:

MyDelegate *delegate;

- (IBAction)testUIAlertView:(id)sender 
{
    //MyDelegate *delegate = [MyDelegate alloc]; //注意,这样写有问题!
    
    delegate = [MyDelegate alloc];
    
    UIAlertView *alertView = [[UIAlertView alloc] 
                             initWithTitle:@"新版本提示" 
                             message:@"该程序有一个新版本,是否升级?" 
                             delegate:delegate 
                             cancelButtonTitle:@"忽略" 
                             otherButtonTitles:@"现在升级", nil];
    [alertView show];
}
posted @ 2014-03-12 17:02  CoderWayne  阅读(2296)  评论(0编辑  收藏  举报