[IOS] 自訂AlertView實現模態對話方塊

來源:互聯網
上載者:User

在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;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.