我有一個視圖,帶有一個導航控制器管理的後退按鈕,我想檢查用戶單擊後退按鈕時是否保存了文件。 如果文件已保存,則返回上一個視圖,否則uialertview會詢問您是否要保存該文件。iphone navigationController:在退出當前視圖之前等待uialertview響應
所以我做到了,但視圖disapear和alertview後出現。
我有一個視圖,帶有一個導航控制器管理的後退按鈕,我想檢查用戶單擊後退按鈕時是否保存了文件。 如果文件已保存,則返回上一個視圖,否則uialertview會詢問您是否要保存該文件。iphone navigationController:在退出當前視圖之前等待uialertview響應
所以我做到了,但視圖disapear和alertview後出現。
當viewWillDisappear被調用時,已經太晚了。你應該在之前攔截後退按鈕。我從來沒有做過,但我的建議是設置上的導航欄屬性代表在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 *)項目。 您應該設置視圖控制器採用的自定義委託協議,如果允許它彈出,請調用您的[super navigationBar shouldPopItem:],否則返回上述方法的NO。
我已經實現了這一點,並可以驗證它是否工作,在我看來是最簡單的方法來完成此操作。 – 2011-07-17 23:56:43
那豈不是更容易只是左鍵項目添加如下所示:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(saveThisDate)];
self.navigationItem.leftBarButtonItem = backButton;
[backButton release];
要跟進諾佈雷響應和喬恩mentionned它,最好的辦法是子類的UINavigationController。
最簡單的方式和以達致這最快的方式:
@interface YourViewController <CustomNavigationControllerDelegate>
#pragma mark - UINavigationBar Delegate Methods
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:cancel otherButtonTitles:ok, nil];
alert.tag = kpopup_back;
[alert show];
return NO;
}
#pragma mark - viewWillAppear - (void) viewWillAppear:(BOOL)animated { ((CustomNavigationController*)self.navigationController).customDelegate = self; }
case kpopup_back : { if(buttonIndex != 0) //OK { ((CustomNavigationController*)self.navigationController).customDelegate = nil; [self.navigationController popViewControllerAnimated:YES]; } } break;
它完美的作品在我的身邊,希望能有所幫助。
這裏有來源:
CustomNavigationControllerDelegate.h
#import <UIKit/UIKit.h>
@protocol CustomNavigationControllerDelegate <NSObject>
@optional
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item;
@end
@interface CustomNavigationController : UINavigationController
@property (nonatomic, retain) id<CustomNavigationControllerDelegate> customDelegate;
@end
CustomNavigationControllerDelegate.m
#import "CustomNavigationController.h"
@interface CustomNavigationController()
@end
@implementation CustomNavigationController
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {
if (_customDelegate && [_customDelegate respondsToSelector:@selector(navigationBar:shouldPopItem:)]) {
return [_customDelegate navigationBar:navigationBar shouldPopItem:item];
}
return YES;
}
@end
聽起來合乎邏輯,但你應該保存當前的導航欄在覆蓋它之前委託,在你決定彈出之後重置它,甚至可以在顯示你的警報之前通過'navigationBar:shouldPopItem:'調用舊的委託(如果不是零)。 – pix0r 2009-09-08 22:29:26
該代碼不會出現alertview – Mathieu 2009-09-08 22:33:34
@Mathieu:該方法是否應該調用該方法?如果不是,則可能必須在viewDidAppear方法而不是init方法中設置委託。 pix0r的評論也是有效的。我會更新我的答案以反映這一點。 – 2009-09-08 22:37:47