记一次连续pushViewController导致Can't add self as subview崩溃问题

线上崩溃反馈
96671211-F3FB-4532-BB8C-831DED659A0D.png
猜想崩溃原因

某一时刻、某一场景突然连续push多个界面动画相关导致(比如有说多个通知、多个回调一起执行连续push)

问题重现简化代码,
- (void)clickButton {
    
    ViewController *vc1 = ViewController.new;
    vc1.title = @"vc1";

    ViewController *vc2 = ViewController.new;
    vc2.title = @"vc2";
    
    ViewController *vc3 = ViewController.new;
    vc3.title = @"vc3";

    [self.navigationController pushViewController:vc1 animated:NO];
    [self.navigationController pushViewController:vc2 animated:YES];
    [self.navigationController pushViewController:vc3 animated:YES];

}

代码执行完在vc3点击返回vc2时候,发现vc2界面的view没有显示出来,继续点击vc2的返回按钮时候,就崩溃闪退了

解决问题
#import "ZYXNavigationController.h"

@interface ZYXNavigationController ()<UINavigationControllerDelegate>
@property (assign, nonatomic) BOOL isSwitching;
@property (nonatomic, strong) NSMutableArray *pushVCArr;/**< */
@end

@implementation ZYXNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.pushVCArr = [NSMutableArray array];
    self.delegate = self;
}
// 重载 push 方法
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    
    if (animated) {
        if (self.isSwitching) {
            [self.pushVCArr addObject:viewController];// 1. 如果是动画,并且正在切换,保存viewController
            return;
        }
        self.isSwitching = YES; // 2. 否则修改状态
    }
    [super pushViewController:viewController animated:animated];
}

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    self.isSwitching = NO; // 3. 还原状态
    if (self.pushVCArr.count>0) {
        // 取出保存的vc,执行push
        UIViewController *vc = self.pushVCArr[0];
        [self pushViewController:viewController animated:YES];
        [self.pushVCArr removeObject:vc];
    }
}

@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,558评论 25 708
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,018评论 3 119
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,975评论 2 59
  • 暮鼓的钟声 荡着晚阳碎波 牵一缕孤烟细长 乘风潇洒而别 碎了一地的红叶 是你留给我的别离 边城的烽火 映着苍天落日...
    良暖阅读 191评论 0 3