您的位置:首页 > 产品设计 > UI/UE

iphone navigationController : wait for uialertview response before to quit the current view

2012-08-16 17:25 441 查看
http://stackoverflow.com/questions/1396582/iphone-navigationcontroller-wait-for-uialertview-response-before-to-quit-the-c

I have a view with a back button managed with a navigation controller and I want to check if a file has been saved when the user click on the back button. If the file has been saved you go back in the previous view, else a uialertview ask you if you want to
save the file or not.

So I did that but the view disapear and the alertview appear after.
-(void)viewWillDisappear:(BOOL)animated {
if(!self.fileSaved){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Save the file?"  delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes",nil];
[alert show];
[alert release];
}
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
switch (buttonIndex) {
case 0:
NSLog(@"NO");
break;
case 1:
NSLog(@"yes");
break;
default:
break;
}
}


iphone objective-c uinavigationcontroller uialertview
share|improve
this question
asked Sep
8 '09 at 22:06





Mathieu

2561623

80% accept rate
feedback


3 Answers

activeoldestvotes

up
vote4down
vote
When viewWillDisappear is called, it's already too late. You should intercept the back button earlier on. I have never done it, but my suggestion is to set the delegate on the navigationBar property in your viewDidAppear method:
// save the previous delegate (create an ivar for that)
prevNavigationBarDelegate = self.navigationController.navigationBar.delegate;

self.navigationController.navigationBar.delegate = self;


Don't forget to set it back in viewWillDisappear:
self.navigationController.navigationBar.delegate = prevNavigationBarDelegate;


Then intercept the shouldPopItem method:
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {
if(!self.fileSaved) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Save the file?"  delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes",nil];
[alert show];
[alert release];

return NO;
}

if ([prevNavigationBarDelegate respondsToSelector:@selector(navigationBar:shouldPopItem:)])
return [prevNavigationBarDelegate navigationBar:navigationBar shouldPopItem:item];

return YES;
}


And in the YES handler for the dialog, manually pop the controller:
[self.navigationController popViewController:YES];


share|improve
this answer
edited Sep
8 '09 at 22:41

answered Sep
8 '09 at 22:18




Philippe
Leybaert

35.6k495132

Sounds
logical, but you should probably save the current navigation bar delegate before overwriting it, reset it after you've decided to pop yourself, and maybe even pass through the
navigationBar:shouldPopItem:
call
to the old delegate (if not nil) before showing your alert. – pix0r Sep
8 '09 at 22:29
The
alertview doesn't appear with this code – Mathieu Sep
8 '09 at 22:33
@Mathieu:
Is the method shouldPopItem called? If not, you may have to set the delegate in the viewDidAppear method instead of the init method. pix0r's comment is also valid. I'll update my answer to reflect that. – Philippe
Leybaert Sep
8 '09 at 22:37
The
shouldPopItem is not called either if I set the delegate in the viewDidAppear or viewDidLoad or in the init method – Mathieu Sep
8 '09 at 22:47
1
There
is a problem with this because you cannot change the delegate for a navigation bar that was "created by a navigation controller and is being managed by that object" (per Apple documentation). – yabada Nov
23 '10 at 19:15
feedback





up
vote4down
vote
You must subclass UINavigationController for this to work. Then override - (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item . You should set up a custom Delegate protocol that your view controllers adopt and, if you
allow it to pop, call your [super navigationBar shouldPopItem:], else, return NO to the above method.

share|improve
this answer
answered May
11 '10 at 16:44





nobre

590510

I
have implemented this and can verify that it does work and in my opinion is the cleanest way to accomplish this. – Jon
Steinmetz Jul
17 '11 at 23:56
feedback
up
vote1down
vote
Wouldn't it be easier just to add a left button item as in:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(saveThisDate)]; self.navigationItem.leftBarButtonItem = backButton; [backButton release];

share|improve
this answer
answered Oct
30 '11 at 23:24





John

111

I
tried all the other complicated stuffs from other posts, but this one worked like a charm without the complications. – gangt May
21 at 5:19
Was this post useful to you?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐