Modal View Controllers appear behind Action Sheet
My modal view controllers are being shown behind my UIActionSheet, and my UIActionSheet is not getting dismissed. I am using:
[self presentModalViewController:composeTweetView animated:YES];
To present my modal view controller.
My action sheet is being shown from the tabBar:
[actionSheet showFromTabBar:self.parentViewController.tabBarController.tabBar];
This code worked on iOS 4.0.
if (buttonIndex == 0) {
if (self.isLoggedIn) {
[FlurryAPI logEvent:@"ST_REPLY_CLICKED"];
composeTweetView.isDirectMessage = FALSE;
[self presentModalViewController:composeTweetView animated:YES];
[composeTweetView release];
}
else {
LoginViewController* loginView = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
loginView.delegate = self;
loginView.isPostingComment = TRUE;
self.isReply = TRUE;
[self presentModalViewController:loginView animated:YES];
[loginView release];
[composeTweetView release];
}
}
Summary:
I have a UIViewController that contains a UITabBar. I am presenting a UIActionSheet which has a few buttons that present a modal view control开发者_运维技巧ler. When the modal view controller is presented, the UIActionSheet should dismiss itself and the modal view should be on the top of the stack. The problem is, the UIActionSheet does not dismiss, and the modal view is loaded behind it. This problem did not occur up until iOS 4.2.1
Steps to Reproduce:
- Create a TabBar project, setting your Base SDK to iOS 4.2.1
- Create a button or trigger to show a UIActionSheet
- Allow one of the buttons in the UIActionSheet to present a modal view controller using the syntax:
[actionSheet showFromTabBar:self.parentViewController.tabBarController.tabBar];
Expected Results:
1. The UIActionSheet should dismiss itself, and the modal view should appear in front
Actual Results:
1. The UIActionSheet does not get dismissed and the modal view appears behind it.
Regression:
This problem was not apparent prior to iOS 4.2.1
Notes: I have tried other ways of displaying the UIActionSheet all of which don't work as intended:
//[actionSheet showInView:self.parentViewController.tabBarController.tabBar];
//[actionSheet showInView:[self.view window]];
//[actionSheet showInView:self.parentViewController.tabBarController.view];
//[actionSheet showInView:[UIApplication sharedApplication].keyWindow];
In putting together a sample in order to reproduce your problem I took a look at the UIActionSheet delegate methods. I believe you can use:
actionSheet:didDismissWithButtonIndex:
instead of
actionSheet:clickedButtonAtIndex:
I haven't tested it, but I believe you still get the same button number and it doesn't fire until the actionsheet has disappeared from the view.
I don't understand your problem sorry but everything works great for me. I have tried the following code in Simulator and on 4.2.1 iPod Touch 4G (both worked)
- (IBAction)doit {
UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"title" delegate:self cancelButtonTitle:@"not OK" destructiveButtonTitle:@"Absolutely" otherButtonTitles:nil];
[actionSheet showFromTabBar:self.tabBarController.tabBar];
[actionSheet release];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0) {
UIView *v = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
v.backgroundColor = [UIColor redColor];
[self.view addSubview:v];
[v release];
}
}
- created the TabBar sample project
- added button to firstView-nib and connected with the appropriate
IBAction
(have to name theFileOwner
toFirstViewController
) - set the delegate method in
FirstViewController.h
(<UIActionSheetDelegate>
) - added the code above
//EDIT: ok I saw that you want to present it modally but even this works for me on 4.2.1
TMPController *tmp = [[TMPController alloc]initWithNibName:@"TMP" bundle:nil];
[self presentModalViewController:tmp animated:YES];
[tmp release];
maybe it works because I use self.tabBarController.tabBar
, try that
Not sure if you have already resolved this. But I didn't see a clear answer above. I was having exactly the same problem as you. So in the end, it was an issue on my side, but what help me debug this was to add the actual action code in the method
actionSheet:didDismissWithButtonIndex:
as suggested by Matthew.
This proved that the view was actually dismissed. That's when I realized that I put the UIActionSheet alloc in my viewWillAppear method. So each time the view appears it re-creates the action sheet.
This seems weird as the SDK Documentation states:
actionSheet:clickedButtonAtIndex: … The receiver is automatically dismissed after this method is invoked.
I can think of 3 possibilities why it may not disappear:
- The main runloop (main thread!) which handles the animations and display stuff is not called. Do you work something heavy in your main thread like synchronous networking calls? (note the word "after" in the SDK text)
- Somehow you schedule to show the action sheet multiple times
- You display the same view controller instance modally that is already somewhere below the current view on the view stack.
I just wrote a quick sample app to test this out and it worked just as I expected (i.e., I couldn't repro your issue). It was a little different in that I didn't do a TabBar application but I'm still hopeful this helps. What I did with the UIActionSheet
was to show it like this: [actionSheet showInView:self.view]
. Maybe that will work?
Sorry for the rushed answer, I was on my way out when this caught my eye. :)
I have also faced problems like this with iOS 4.2. I think you should try with the following steps:
- Create a separate method for the code you want to be executed on clicking the actionsheet button. suppose the method is -(void)presentModalView{}
2.Now in the - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex method,Call the presentModalView{} method for the clicked button index like this:
if(buttonIndex==0)
{
[self performSelector:@selector(presentModalView) withObject:nil afterDelay:0.3];
}
3.You can also try by different delay time.
Hope it helps..
I had the same issue calling MailComposeView from AlertBox/ActionSheet caused the MailCompseView to come behind invisible screen.
I solved it by calling dismissWithClickedButtonIndex:animated: in the actionSheet button handler.
The problem has been resolved in iOS5.
精彩评论