Inoperative Cancel button in UIActionSheet

Let’s say you want to use UIActionSheet to show three buttons to the user with a cancel buttons in a UIView, which itself is managed by a UITabBarController:

Your code would probably look like this:

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@”Action Title” delegate:self cancelButtonTitle:@”Cancel” destructiveButtonTitle:nil otherButtonTitles:@”Option 1″@”Option 2″@”Option 3″nil];

actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

[actionSheet showInView:self.view];

[actionSheet release];

And you’ll also probably find that all the 3 option buttons works, but the Cancel one doesn’t!
It is because the UIView which the UIAlertSheet belongs to is behind the UITabBarController, and the TabBar’s hitTest method gets called before the UIAlertSheet’s.
To fix this, it is just a simple matter of using the view from the UITabBarController in the showInView method. Like this:

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@”Action Title” delegate:self cancelButtonTitle:@”Cancel” destructiveButtonTitle:nil otherButtonTitles:@”Option 1″@”Option 2″@”Option 3″nil];

actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

UIApplicationDelegate *appDelegate = (UIApplicationDelegate *)[[UIApplication sharedApplication] delegate];

UITabBarController *tabBarController = appDelegate.tabBarController;

[actionSheet showInView:tabBarController.view];

[actionSheet release];

Advertisements

2 comments

  1. Kall

    Thanx a lot, was the exact issue I had…
    Two small errors in your code : ApplicationDelegate doesn’t exist, it’s UIApplicationDelegate.

    Second : for a reason I can’t explain, never managed to get the correct includes so that UIApplicationDelegate is recognized (though I had included the UIKit framework and had this line on top : #include … Well had a workeround like this :
    [actionSheet showInView:self.tabBarController.view];

    My view hierarchy is window > UITabBarViewControler > UINavigationControler > UIViewControler which pushed the UIViewControler in which I had the problem.

    So don’t ask me how it could find the reference to the root tabBarControler.view just with “self.tabBarControler.view” but all I know is that it works !

    By the way, happy to know I’m not the only developer working on both .Net projects and iPhone apps !

    • Alex Hung

      To use UIApplicationDelegate, you’ll have to import ApplicationDelegate.h like:

      #import “ApplicationDelegate.h”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s