自定义AlertView实现模态对话框

在Windows应用程序中,经常使用模态(Model)对话框来和用户进行简单的交互,比如登录框。
在IOS应用程序中,有时我们也希望做同样的事情。但IOS的UI库中,没有模态对话框,最接近那个样子的应该算是AlertView。
但仅用AlertView,我们只能做文字提示,而不能和用户做交互。

本文将介绍如何基于AlertView做定制,实现模态对话框的功能。以密码修改框为例:

1. 首先,我们要继承AlertView类,在类的头文件PwdModifyView.h中,加入控件的声明
    这里我们把控件都声明为property,目的是让外部的类可以访问用户输入的数据。

#import <UIKit/UIKit.h>

@interface PwdModifyView : UIAlertView

@property(nonatomic, retain) UITextField* _oldPwd;    // 旧密码输入框
@property(nonatomic, retain) UITextField* _newPwd;    // 新密码输入框
@property(nonatomic, retain) UITextField* _cfmPwd;    // 新密码确认框

@end

2. 在PwdModifyView.m文件中,需要实现两个函数

- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... {
    self = [super initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil];
    if (self != nil) {
        // 初始化自定义控件,注意摆放的位置,可以多试几次位置参数直到满意为止
        // createTextField函数用来初始化UITextField控件,在文件末尾附上
        self._oldPwd = [self createTextField:@"旧密码"
                                   withFrame:CGRectMake(22, 45, 240, 36)];
        [self addSubview:self._oldPwd];

        self._newPwd = [self createTextField:@"新密码"
                                   withFrame:CGRectMake(22, 90, 240, 36)];
        [self addSubview:self._newPwd];

        self._cfmPwd = [self createTextField:@"确认新密码"
                                   withFrame:CGRectMake(22, 135, 240, 36)];
        [self addSubview:self._cfmPwd];
    }

    return self;
}

// Override父类的layoutSubviews方法
- (void)layoutSubviews {
    [super layoutSubviews];     // 当override父类的方法时,要注意一下是否需要调用父类的该方法

    for (UIView* view in self.subviews) {
        // 搜索AlertView底部的按钮,然后将其位置下移
        // IOS5以前按钮类是UIButton, IOS5里该按钮类是UIThreePartButton
        if ([view isKindOfClass:[UIButton class]] ||
            [view isKindOfClass:NSClassFromString(@"UIThreePartButton")]) {
            CGRect btnBounds = view.frame;
            btnBounds.origin.y = self._cfmPwd.frame.origin.y + self._cfmPwd.frame.size.height + 7;
            view.frame = btnBounds;
        }
    }

    // 定义AlertView的大小
    CGRect bounds = self.frame;
    bounds.size.height = 260;
    self.frame = bounds;
}

3. 当需要弹出该对话框时,只需创建并初始化一个PwdModifyView对象,然后调用对象的show()方法即可。

PwdModifyDlg* pwdModifyDlg = [[PwdModifyView alloc]
                     initWithTitle:@"密码修改"
                     message:nil
                     delegate:self
                     cancelButtonTitle:@"确定"
                     otherButtonTitles:@"取消", nil];
[pwdModifyDlg show];

最后,附上UITextField的创建函数

- (UITextField*)createTextField:(NSString*)placeholder withFrame:(CGRect)frame {
    UITextField* field = [[UITextField alloc] initWithFrame:frame];
    field.placeholder = placeholder;
    field.secureTextEntry = YES;
    field.backgroundColor = [UIColor whiteColor];
    field.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

    return field;
}

自定义AlertView实现模态对话框

时间: 2024-12-06 07:55:30

自定义AlertView实现模态对话框的相关文章

QT模态对话框用法(在UI文件中设置Widget背景图,这个图是一个带阴影边框的图片——酷)

QT弹出模态对话框做法: 1.新建UI文件时,一定要选择基类是QDialog的,我的选择是:Dialog without Buttons(),如下图: 2.然后在使用的时候: MyDialog dlg(this); dlg.exec(); 如果不加this,则会在任务管理器里面产生一个新的EXE. 3.如果对话框的标题是自定义,不想使用系统的标题,这时候需要在代码中加入: setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint ); setAttr

第11章 对话框_11.1 模态对话框

对话框管理器——Windows内置的对话框代码 ①负责创建对话框窗口及其上面的子窗口控件:在创建对话框函数的内部,Windows使用用户自定义的对话框模板,并且使用Windows内部定义的窗口类(一般类名是“#32770”)来创建对话框. ②提供内置的窗口过程来处理对话框消息(包括所有鼠标和键盘输入) ③内置的窗口过程会将消息传递给我们自定义的“对话框过程”(也叫“对话过程”). ④对话框中,Windows负责处理在多个控件中转移输入焦点的相关逻辑. 11.1 模态对话框 11.1.1 对话框及

html5各种页面切换效果和模态对话框

页面动画:data-transition 属性可以定义页面切换是的动画效果.例如:<a href="index.html" data-transition="pop">I'll pop</a>data-transition 参数表:参数说明slide 从右侧向左滑入页面slideup 从底部向上滑入slidedown 从上向下滑入pop 从中心渐显展开fade 渐显flip 翻转备注:如果想要在目标页面中显示后退按钮,可以在链接中加入 dat

VS2010/MFC对话框:非模态对话框的创建及显示

非模态对话框的创建及显示 上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将上一讲中创建的Tip模态对话框改为非模态对话框,让大家看下效果. 非模态对话框的对话框资源和对话框类 实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,所以上一讲中创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改. 创建及显示非模态

【精品推荐】web开发人员应该知道的31个jQuery模态对话框

在网站开发中经常会用到模态窗口,如果直接利用javascirpt的window.showModalDialog()打开一个模式窗口,虽然实现了模式窗口的功能,但十分的不好看.当我们遇到这样的需求时很多人会从网上寻找这些jQuery的模态对话框,有时候搜索了很多,但都不是很合适,那为什么人们喜欢模态窗口呢?那模态窗口到底有什么优点呢? 当一个模态窗口包含一个较小的元素时,用户并不需要加载一个完成的全新新页面就可以访问它.(达到同样效果的另一种方式来是使用基于AJAX的标签) . 通过模态窗口,您提

QT模态对话框及非模态对话框

QT模态对话框及非模态对话框 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等.所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互. 在Qt中,显示一个对话框一般有两种方式,一种是使用exec()方法,它总是以模态来显示对话框

QT笔记之模态对话框及非模态对话框

模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等.所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互. 在Qt中,显示一个对话框一般有两种方式,一种是使用exec()方法,它总是以模态来显示对话框:另一种是使用show()方法

JavaScript内容梳理 示例之模态对话框 示例之全选和反选以及取消 示例之后台管理左侧菜单

1 <!DOCTYPE html> 2 <!--示例之模态对话框--> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7 <style> 8 .hide{ 9 display: none; 10 } 11 .c1{ 12 position: fixed; 13 lef

bootstrap添加多个模态对话框支持

bootstrap添加多个模态对话框支持 (2015-03-04 21:05:35) 转载▼ 标签: 房产   因为项目需要,在页面交互上要弹出多个dialog窗口,而bootstrap的modal支持弹出dialog窗口,但是如果在此基础上,会出现遮罩层越来越多,背景越来越黑的情况. 代码具体如下: (function(){ modal = {}; modal.openDialog = function(url, title, width, height, id){}; modal.close