美文网首页
对于类别中,实现Delegate方法的问题

对于类别中,实现Delegate方法的问题

作者: 生命不止运动不息 | 来源:发表于2019-08-15 13:50 被阅读0次

    今天遇到一个奇怪的bug,就是禁用UINavigationController左滑返回,怎么也没有效果。

    禁用代码如下:

    self.interactivePopGestureRecognizer.enabled =NO;
    

    后来仔细搜索排查,发小有个类别实现了UINavigationController的delegate方法,并在其中打开左滑返回开关。

    @interface UINavigationController (TRPopGesture)<UIGestureRecognizerDelegate,UINavigationControllerDelegate>
    @end
    
    #pragma mark - UINavigationControllerDelegate
    
    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
        // 转发给业务方代理
        if (self.tr_naviDelegate && ![self.tr_naviDelegate isEqual:self]) {
            if ([self.tr_naviDelegate respondsToSelector:@selector(navigationController:didShowViewController:animated:)]) {
                [self.tr_naviDelegate navigationController:navigationController didShowViewController:viewController animated:animated];
            }
        }
        // 让系统的侧滑返回生效
        self.interactivePopGestureRecognizer.enabled = YES;
        if (self.childViewControllers.count > 0) {
            if (viewController == self.childViewControllers[0]) {
                self.interactivePopGestureRecognizer.delegate = self.tr_popDelegate; // 不支持侧滑
            } else {
                self.interactivePopGestureRecognizer.delegate = nil; // 支持侧滑
            }
        }
    }
    
    

    这个类别是一个第三方,用来解决侧滑返回失效的问题。但每次push都会调用该delegate,无论你是否使用了这个类别。这就是系统的runtime机制导致的。

    得出教训:不要随意在类别中实现delegate,特别是系统类的delegate方法。

    相关文章

      网友评论

          本文标题:对于类别中,实现Delegate方法的问题

          本文链接:https://www.haomeiwen.com/subject/avhzjctx.html