UINavigationController 给pop增加回调方法

一、应用场景

我们需求是push之后一个界面,再pop回来,需要检测一下,如果不符合,就再Pop回去。(其实这样的动画也不是太好。)

二、正常的敲代码

A push B push C

 [self.navigationController popViewControllerAnimated:YES]; // C回来

 if (YES) { // 某种检测逻辑(联网检测) B页面
   [self.navigationController popViewControllerAnimated:YES]; // 连续pop
 }

这时候我们惊人的发现,iOS7的机子crash。这时候内心是抓狂的。顿时觉得,这什么破需求碰上了系统没有优化的bug(iOS8以上(含)系统已自动修复)。

这时候我们解决办法就是等上一个pop结束。再检测pop。上一个pop结束的时机就是B页面viewDidAppear和C页面的viewDidDisappear

三、黑魔法给pop添加完成回调

UIViewController交换方法实现

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [self swizzleOriginMethod:@selector(viewDidDisappear:) anotherSelecor:@selector(xks_viewDidDisappear:)];
    });
}
- (void)xks_viewDidDisappear:(BOOL)animated {
    [super xks_viewDidDisappear:animated];

    void(^popCompeletion)() = objc_getAssociatedObject(self, @"popCompeletion");
    if (popCompeletion) {
        popCompeletion();
    }
}

UINavigationController给增加分类,pop回调

- (void)popViewControllerAnimated:(BOOL)animated compeletion:(void(^)())compeletion {
   UIViewController *topVC = self.topViewController;

    __weak typeof(topVC) weakTopVC = topVC;
    void(^popCompeletion)() = ^{
        __strong typeof(weakTopVC) topVC = weakTopVC;
        BOOL directPop = [objc_getAssociatedObject(topVC, @"directPop") boolValue];
        if (!directPop) { // 预防compeletion被多次执行
            objc_setAssociatedObject(topVC, @"directPop", @(YES), OBJC_ASSOCIATION_ASSIGN);
            
            if (compeletion) {
                compeletion();
            }
        }
    };
    objc_setAssociatedObject(topVC, @"popCompeletion", popCompeletion, OBJC_ASSOCIATION_COPY_NONATOMIC);
    
    [self popViewControllerAnimated:animated];
}

四、优雅的使用

给目标C植入block

__weak typeof(self) weakSelf = self;
cVC.compeletion = ^{
   __strong typeof(weakSelf) self = weakSelf;
   // C回来之后,再pop
   [self.navigationController popViewControllerAnimated:YES compeletion:{
      if (YES) { // 某种检测逻辑(联网检测) B页面
         [self.navigationController popViewControllerAnimated:YES]; // 连续pop,pop到A
      }
   }];
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,200评论 30 471
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,196评论 4 61
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,242评论 1 23
  • 172.简述视图控制器的生命周期。 1)init函数(init;initWithFrame;initWithCod...
    AlanGe阅读 389评论 0 0
  • 领域特殊性和回路错误的关系是面和点的关系,它们都是在我们的认知系统中已经形成的本能认知回路,这里对“回路”形成的过...
    崩豆老师阅读 498评论 0 1