Um auf nobre Reaktion zu verfolgen und wie Jon es erwähnt, ist der beste Weg UINavigationController Unterklasse.
Der einfachste Weg und schnellster Weg, dies acheive:
- die Klasse Ihrer Navigationssteuerung im Interface Builder Ändern von CustomNavigationControllerDelegate erben
- Implementieren Sie das CustomNavigationControllerDelegate-Protokoll in Ihrem UIViewController
@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;
}
- dem Controller als Delegierter registrieren
#pragma mark - viewWillAppear - (void) viewWillAppear:(BOOL)animated { ((CustomNavigationController*)self.navigationController).customDelegate = self; }
- Schließlich und wichtig Teil, ENTFERNEN Sie den Delegaten (um zu vermeiden, dass Sie sich beim Pop erneut auslösen), und setzen Sie den Controller selbst in das UIAlertViewDelegate
case kpopup_back : { if(buttonIndex != 0) //OK { ((CustomNavigationController*)self.navigationController).customDelegate = nil; [self.navigationController popViewControllerAnimated:YES]; } } break;
Es funktioniert einwandfrei auf meiner Seite, hoffe, es kann helfen.
Hier sind die Quellen:
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
Klingt logisch, aber Sie sollten wahrscheinlich sparen Die aktuelle Navigationsleiste Delegieren Sie vor dem Überschreiben, setzen Sie es zurück, nachdem Sie sich entschieden haben, sich selbst zu popularisieren und vielleicht sogar den 'navigationBar: shallPopItem: 'Aufruf an den alten Delegaten (wenn nicht NULL) vor dem Anzeigen Ihrer Warnung. – pix0r
Die Alertview erscheint nicht mit diesem Code – Mathieu
@Mathieu: Wird die Methode shouldPopItem aufgerufen? Wenn nicht, müssen Sie möglicherweise den Delegaten in der viewDidAppear-Methode anstelle der init-Methode festlegen. Der Kommentar von pix0r ist ebenfalls gültig. Ich werde meine Antwort aktualisieren, um das zu reflektieren. –