iOS 多次push同一个控制器

重写导航控制器的push方法,通过获取导航的代理方法来防止多次push界面的bug

.h

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface CoustomNavVC : UINavigationController

@end

NS_ASSUME_NONNULL_END

实现文件

#import "CoustomNavVC.h"

@interface CoustomNavVC () <UINavigationControllerDelegate>

@end

@implementation CoustomNavVC

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.delegate = self;
}

//支持旋转
-(BOOL)shouldAutorotate
{
    return [self.topViewController shouldAutorotate];
}

//支持的方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations];
}

//2019/9/5
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.topViewController preferredInterfaceOrientationForPresentation];
}

//防止多次push同一个控制器
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
     //这个方法是在当前控制器执行push的时候,禁止手势右划返回,避免出现crash的现象
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.interactivePopGestureRecognizer.enabled = NO;
    }
    //判断上一个控制器和现在的控制器是不是同一个,如果是,返回。如果不是push到当前控制器,这就有效避免了同一个控制器连续push的问题
    if ([self.topViewController isMemberOfClass:[viewController class]]) {
        return;
    }
    [super pushViewController:viewController animated:animated];
}

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.interactivePopGestureRecognizer.enabled = YES;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,573评论 0 17
  • 严格要求自己 从明天开始
    杏林梵景yoga康纪伟阅读 120评论 0 0
  • 每一个城市在旧历年都人烟稀少起来。街道两侧停放的私家车都少了,前面的市场纷纷关店过年。熙攘的市场只有过年才是安静的...
    聆听色彩阅读 56评论 0 0