這篇文章主要學習alertview 和 actionsheet這兩個控制項的使用。Action Sheet是從底部彈出,上面有2個或者2個以上的選項供使用者選擇,Alert就是一個警告框,上面有1個或者1個以上的按鈕供使用者進行選擇。
(說明:其實這兩個不是控制項,而是ios 中的兩個類,這裡暫且這麼叫吧。這2個類定義了2種不同類型的用於和使用者互動的彈出框)
首先,使用這兩個類要使用到其代理,UIAlertViewDelegate 和 UIAlertViewDelegate 。
下面,借用別的部落格上的一段話來稍稍闡述一下delegate。
ios中有很多已經定義好的類可以供我們在編寫程式時直接使用,例如UIActionSheet、UIAlertView等,這些類定義了很多method,我們可以調用這些method且不必知道這些method是如何?的。但是有一個問題,如果我們想改變這些method的實現,那我們該這麼做呢?一種方法是繼承,我們可以繼承一個類,然後在自己的類中重新寫method,這是一個方法,但不是一個很方便的方法,有時候你僅僅需要改變很小的一個功能,卻要繼承一個很大的類,貌似有點複雜了,而且如果你需要一些不同的實現,那你就需要定義好多不同的類,這會很麻煩。為了使開發過程更加的方便,ios使用了另一種方法來達到同樣的目的,就是使用delegate,我們使用一個已定義的類,然後使用委託\代理來改寫類中的method,程式在運行時,delegate發現你建立了某個類的執行個體且改寫了其中的method,這樣程式在運行時就不會去調用原有的實現(當然你也可以調用原有的實現),而是直接調用你寫的新的實現,從而達到自訂程式方法的目的。
首先介紹actionsheet。
1、只有一個OK按鍵
- (void)dialogSimpleAction{// open a dialog with just an OK buttonUIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"UIActionSheet <title>"delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"OK" otherButtonTitles:nil];actionSheet.actionSheetStyle = UIActionSheetStyleDefault;[actionSheet showInView:self.view];// show from our table view (pops up in the middle of the table)}
上面code中的最後一行:
[actionSheet showInView:self.view]
作用是顯示actionSheet,每一個ActionSheet都需要有一個parent view,在parent view中顯示自己,因為我們是單一視圖項目(Single View),也只有一個View,因此這裡的self.view就是說在actionSheet實現的這個view裡顯示。
注意其中的style有以下四種類型:
UIActionSheetStyleSpecifies the style of an action sheet.typedef enum { UIActionSheetStyleAutomatic = -1, UIActionSheetStyleDefault = UIBarStyleDefault, UIActionSheetStyleBlackTranslucent = UIBarStyleBlackTranslucent, UIActionSheetStyleBlackOpaque = UIBarStyleBlackOpaque,} UIActionSheetStyle;
2、有一個OK 和 Cancel 按鍵
- (void)dialogOKCancelAction{// open a dialog with an OK and cancel buttonUIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"UIActionSheet <title>"delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"OK" otherButtonTitles:nil];actionSheet.actionSheetStyle = UIActionSheetStyleDefault;[actionSheet showInView:self.view]; // show from our table view (pops up in the middle of the table)}
3、含有兩個custom(自訂)按鍵
- (void)dialogOtherAction{// open a dialog with two custom buttonsUIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"UIActionSheet <title>"delegate:self cancelButtonTitle:nil destructiveButtonTitle:nilotherButtonTitles:@"Button1", @"Button2", nil];actionSheet.actionSheetStyle = UIActionSheetStyleDefault;actionSheet.destructiveButtonIndex = 1;// make the second button red (destructive)[actionSheet showInView:self.view]; // show from our table view (pops up in the middle of the table)}
注意其中的actionSheet.destructiveButtonIndex = 1;// make the second button red (destructive)
重點,這裡要實現前面說到的UIActionSheetDelegate ,這裡要實現一個方法。
#pragma mark - UIActionSheetDelegate- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ // the user clicked one of the OK/Cancel buttonsif (buttonIndex == 0){NSLog(@"ok");}else{NSLog(@"cancel");}}
其中的buttonIndex就是分別對應哪一個按鍵,注意是從0開始的。
接著介紹alert。
1、只有一個OK按鍵
- (void)alertSimpleAction{// open an alert with just an OK buttonUIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"UIAlertView" message:@"<Alert message>"delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];[alert show];}
2、有OK 和 Cancel 兩個按鍵
- (void)alertOKCancelAction{// open a alert with an OK and cancel buttonUIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"UIAlertView" message:@"<Alert message>"delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];[alert show];}
3、有多個按鍵,包含custom(自訂) 按鍵
- (void)alertOtherAction{// open an alert with two custom buttonsUIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"UIAlertView" message:@"<Alert message>"delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Button1", @"Button2", nil];[alert show];}
4、在提示框中有輸入框,用以輸入資訊
- (void)alertSecureTextAction{// open an alert with two custom buttonsUIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"UIAlertView" message:@"Enter a password:" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];alert.alertViewStyle = UIAlertViewStyleSecureTextInput; //An alert that allows the user to enter text. The text field is obscured(遮蔽) [alert show];}
這個是ios5之後新增的一個提示框,包含輸入框用於輸入使用者名稱或者密碼。
其中的alertViewStyle含有這幾種類型。
UIAlertViewStyleThe presentation style of the alert.typedef enum { UIAlertViewStyleDefault = 0, UIAlertViewStyleSecureTextInput, UIAlertViewStylePlainTextInput, UIAlertViewStyleLoginAndPasswordInput} UIAlertViewStyle;
上面說到,這是ios5之後才有的功能,那麼可以用以下的代碼檢測裝置是否支援。
// create a temporary alert to test it's feature availability UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:nil message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease]; // only add this part to the table if secure alerts are available if ([alert respondsToSelector:@selector(alertViewStyle)]) { }
接下來就是,alert的代理方法的實現啦。
#pragma mark - UIAlertViewDelegate- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{// use "buttonIndex" to decide your action}
下面對第四中提示框實現代理方法。實現如何擷取從提示框中輸入的資訊。
- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{// use "buttonIndex" to decide your action UITextField *passWord = [actionSheet textFieldAtIndex:0]; if (buttonIndex == 1) { NSLog(@"password :%@",passWord.text); }}
稍稍解說一下吧: 其中[actionSheet textFieldAtIndex:0]表示的第幾個輸入框;buttonIndex就是表示第幾個按鍵啦。
附註:以上代碼大部分來自一個demo,UICatalog。