自定义的导航栏控制器
@interface ZNNavViewController : UINavigationController
@end
@interface ZNNavViewController ()<UINavigationBarDelegate, UIGestureRecognizerDelegate>
@end
@implementation ZNNavViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationBar.delegate = self;
self.interactivePopGestureRecognizer.delegate = self;
}
@end
@protocol NavbarBackButtonHandlerProtocol <NSObject>
@optional
- (BOOL)zn_navigationBarShouldPopWhenBackButtonClick;
- (BOOL)zn_gestureRecognizerShouldBegin;
@end
@interface UIViewController (BackButtonHandler) <NavbarBackButtonHandlerProtocol>
@end
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationBar.delegate = self;
self.interactivePopGestureRecognizer.delegate = self;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
BOOL shouldPop = YES;
UIViewController* vc = [self topViewController];
if([vc respondsToSelector:@selector(zn_gestureRecognizerShouldBegin)])
{
shouldPop = [vc zn_gestureRecognizerShouldBegin];
}
return shouldPop;
}
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
if([self.viewControllers count] < [navigationBar.items count]) {
return YES;
}
BOOL shouldPop = YES;
UIViewController* vc = [self topViewController];
if([vc respondsToSelector:@selector(zn_navigationBarShouldPopWhenBackButtonClick)])
{
shouldPop = [vc zn_navigationBarShouldPopWhenBackButtonClick];
}
if(shouldPop)
{
[self popViewControllerAnimated:YES];
}
return NO;
}
使用
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (BOOL)zn_gestureRecognizerShouldBegin
{
if (self.textView.text.length == 0) {
return NO;
}
if ([self.saveButton.title isEqualToString:@"Text_VC_Sheet_Edit"]) {
return YES;
}
return NO;
}
- (BOOL)zn_navigationBarShouldPopWhenBackButtonClick
{
if (self.textView.text.length == 0) {
return NO;
}
if ([self.saveButton.title isEqualToString:@"Text_VC_Sheet_Edit"]) {
return YES;
}
return NO;
}
自定义导航栏控制器全部代码
@protocol NavbarBackButtonHandlerProtocol <NSObject>
@optional
- (BOOL)zn_navigationBarShouldPopWhenBackButtonClick;
- (BOOL)zn_gestureRecognizerShouldBegin;
@end
@interface UIViewController (BackButtonHandler) <NavbarBackButtonHandlerProtocol>
@end
@interface ZNNavViewController : UINavigationController
@end
#import "ZNNavViewController.h"
@implementation UIViewController (BackButtonHandler)
@end
@interface ZNNavViewController ()<UINavigationBarDelegate, UIGestureRecognizerDelegate>
@end
@implementation ZNNavViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationBar.delegate = self;
self.interactivePopGestureRecognizer.delegate = self;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
BOOL shouldPop = YES;
UIViewController* vc = [self topViewController];
if([vc respondsToSelector:@selector(zn_gestureRecognizerShouldBegin)])
{
shouldPop = [vc zn_gestureRecognizerShouldBegin];
}
return shouldPop;
}
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
if([self.viewControllers count] < [navigationBar.items count]) {
return YES;
}
BOOL shouldPop = YES;
UIViewController* vc = [self topViewController];
if([vc respondsToSelector:@selector(zn_navigationBarShouldPopWhenBackButtonClick)])
{
shouldPop = [vc zn_navigationBarShouldPopWhenBackButtonClick];
}
if(shouldPop)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self popViewControllerAnimated:YES];
});
}
return NO;
}
@end