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
activeoldestvotes
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
| ||
feedback |
3 Answers
activeoldestvotesup 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];
| ||||||||||||
|
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.
| ||
|
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];
| ||
|
相关文章推荐
- Failed to instantiate the default view controller for UIMainStoryboardFile 'Main'
- [Application]Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' ...
- Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the desi
- Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps
- Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the desi
- Failed to instantiate the default view controller for UIMainStoryboardFile
- X-code报错: Failed to instantiate the default view controller for UIMainStoryboardFile 'Main'
- Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhap
- Failed to instantiate the default view controller for UIMainStoryboardFile
- 错误日志:Failed to instantiate the default view controller for UIMainStoryboardFile
- Failed to instantiate the default view controller for UIMainStoryboardFile
- Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the desi
- Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard'
- Failed to instantiate the default view controller for UIMainStoryboardFile
- Failed to instantiate the default view controller for UIMainStoryboardFile
- IOS 错误:Failed to instantiate the default view controller for UIMainStoryboardFile
- [iOS]Failed to instantiate the default view controller for UIMainStoryboardFile 'Main'
- xcode6新建项目,删除mainstoryboard,新建storyboard报错:failed to instantiate the default view controller for ...
- Failed to instantiate the default view controller for UIMainStoryboardFile 'Main1' - perhaps the des
- Failed to instantiate the default view controller for UIMainStoryboardFile