在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;}