Кажется, что эти ostr.str("")
вызов добивается цели.
Когда вызывается viewWillDisappear, уже слишком поздно. Вы должны перехватить кнопку возврата раньше. Я никогда этого не делал, но я предлагаю установить делегата в свойстве navigationBar в вашем методе viewDidAppear:
// save the previous delegate (create an ivar for that)
prevNavigationBarDelegate = self.navigationController.navigationBar.delegate;
self.navigationController.navigationBar.delegate = self;
Не забудьте вернуть его в viewWillDisappear:
self.navigationController.navigationBar.delegate = prevNavigationBarDelegate;
Затем перехватите метод shouldPopItem:
- (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;
}
И в обработчике YES диалогового окна вручную откройте контроллер:
[self.navigationController popViewController:YES];
Чтобы это работало, необходимо создать подкласс UINavigationController. Затем переопределите - (BOOL) navigationBar: (UINavigationBar *) navigationBar shouldPopItem: (UINavigationItem *) item. Вы должны настроить собственный протокол делегирования, который принимают контроллеры представления, и, если вы разрешите ему всплывать, вызовите свой [super navigationBar shouldPopItem:], иначе верните NO вышеуказанному методу.