Use alerts to inform users of impending actions that might be destructive, "are you sure" types of messages. Usually these are a result of some unexpected action. Alerts should have two buttons: an"okay" button and a "cancel" button. Use alerts sparingly to avoid annoying users. Use action sheets to inform users of alternatives to an action. As Apple points out in their documentation, the Photos application contains a good example of using an action sheet (Figure 11- 13). The user has a choice: use the photo as wallpaper, e-mail the photo, assign it to a contact, or do nothing (cancel). Action sheets are also appropriate when informing a user he or she is performing a potentially destructive task.
Figure 11-13 An action sheet in the Photo application
UIAlertView and UIAlertViewDelegate A UIAlertView presents a modal alert to users. The alert appears and floats above the underlying view. Displaying a UIAlertView is easy: Create the class and display it. As the alert is modal, a user can do nothing else until clicking one of the alert’s buttons. The UIAlertViewDelegate handles the alert’s button actions. If you add buttons to an alert, implement the clickedButtonAtIndex: method in your delegate. Other methods you might implement include the alertViewCancel: or didPresentAlertView: methods. For a complete listing, refer to Apple’s UIAlertViewDelegate Protocol Reference. Alerts should not be misused. Present too many alerts, and you have an annoying application, where users take alerts, if at all. Also, place buttons according to Apple’s recommendation. When alerting a user to a potentially destructive outcome, place the Cancel button on the right (Figure 11-14). When alerting a user to a harmless action, place the Cancel button on the left (Figure 11-15).
Figure 11-14 Alert warning of a potentially destructive action Figure 11-15 Alert warning of a benign action
Creating a Simple UIAlertView
Figure 11-16 A simple alert
Listing 11-7 AlertsProgressViewController.h #import <UIKit/UIKit.h> @interface AlertsProgressViewController : UIViewController <UIAlertViewDelegate> { } @end Listing 11-8 AlertsProgressViewController.m #import "AlertsProgressViewController.h" @implementation AlertsProgressViewController - (void)viewDidLoad { [super viewDidLoad]; UIAlertView * myAlert = [[[UIAlertView alloc] initWithTitle:@"View Loaded" message:@"View loaded successfully." delegate:nil cancelButtonTitle:@‖OK‖ otherButtonTitles:nil] autorelease]; [myAlert show]; }(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex: (NSInteger) buttonIndex { NSLog(@"buttonIndex: %i", buttonIndex); }(void)dealloc { [super dealloc]; } @end In this simple application, the view’s controller implements a UIAlertViewDelegate. Upon clicking the button, the delegate’s clickedButtonAtIndex method executes. This method determines which button a user clicked and routes the user accordingly. The clickedButtonAtIndex method is an instance method declared in UIAlertViewDelegateProtocol and has the following signature: - (void)alertView:(UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex The method takes the clicked button’s index as an NSInteger via the buttonIndex parameter. After processing, this method dismisses the alert. You created a UIAlertView instance through the following code: UIAlertView * myAlert = [[[UIAlertView alloc] initWithTitle:@"View Loaded" message:@"View loaded successfully." delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil] autorelease]; This method is convenient for initializing the alert view. If you wish, you can add more buttons to an alert using the otherButtonTitles parameter in the initWithTitle method. The next task illustrates an alert with two buttons. Using an Alert with Multiple Buttons
Listing 11-9 Code to display an alert with two buttons -(void)viewDidLoad { [super viewDidLoad]; UIAlertView * myAlert = [[[UIAlertView alloc] initWithTitle: @"View Loaded" message:@"View loaded successfully." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@‖Cancel‖,nil] autorelease]; [myAlert show]; }
Figure 11-17 An alert with two buttons
UIActionSheet and UIActionSheetDelegate While an alert displays as a pop-up box, the UIActionSheet slides in from a view’s bottom, a view’s toolbar, or a view’s tab bar. You set where a toolbar slides in from when you display the action sheet. For instance, the following code slides the action sheet from the view’s bottom. [myActionSheet showInView:self.view]; The action sheet’s bottom is aligned with the view’s bottom. Note that if you use this setting when using a tab bar or toolbar, the action sheet’s bottom is hidden by the bar. To prevent this, you display the action sheet using the showFromTabBar: or showFromToolBar: method. For instance, the following code slides the action sheet from the tab bar’s top and aligns the action sheet’s bottom with the bottom of the tab bar. [myActionSheet showFromTabBar:self.view]; UIActionSheets are otherwise very similar to UIAlertViews. You specify an action sheet’s delegate by creating a class adopting the UIActionSheetDelegate. You use this delegate to implement button actions. Methods are similar to UIAlertViewDelegate’s. For instance, the following code handles a button click. - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex Using a UIActionSheet
Figure 11-18 Connecting File’s Owner removeAll action to a button
Listing 11-10 AlertsProgressViewController.h #import <UIKit/UIKit.h> @interface AlertsProgressViewController : UIViewController <UIActionSheetDelegate> { } - (IBAction) removeAll: (id) sender; @end Listing 11-11 AlertsProgressViewController.m #import "AlertsProgressViewController.h" @implementation AlertsProgressViewController - (IBAction) removeAll: (id) sender { UIActionSheet * myActionSheet = [[[UIActionSheet alloc] initWithTitle: @"Remove all?" delegate:self cancelButtonTitle:@"No" destructiveButtonTitle: @"Yes" otherButtonTitles:@"Not Sure",nil] autorelease]; [myActionSheet showInView:self.view]; } - (void) actionSheet: (UIActionSheet *) actionSheet didDismissWithButton Index: (NSInteger) buttonIndex { NSLog(@"buttons index: %i", buttonIndex); if(buttonIndex == [actionSheet cancelButtonIndex]) { NSLog(@"cancelled..."); } } -(void)dealloc { [super dealloc]; }@end Listing 11-12 Debugger console output [Session started at 2009-01-17 10:00:55 -0500.] 2009-01-17 10:00:59.432 AlertsProgress[861:20b] buttons index: 0 2009-01-17 10:01:01.936 AlertsProgress[861:20b] buttons index: 1 2009-01-17 10:01:04.336 AlertsProgress[861:20b] buttons index: 2
Figure 11-19 A UIActionSheet in action
Figure 11-20 An application badge tells me I have 39 e-mails in my inbox.
You liked the article?
Like : 0
Vote for difficulty
Current difficulty (Avg): Medium
1/15
TekSlate is the best online training provider in delivering world-class IT skills to individuals and corporates from all parts of the globe. We are proven experts in accumulating every need of an IT skills upgrade aspirant and have delivered excellent services. We aim to bring you all the essentials to learn and master new technologies in the market with our articles, blogs, and videos. Build your career success with us, enhancing most in-demand skills in the market.
Stay Updated
Get stories of change makers and innovators from the startup ecosystem in your inbox