iOS7 连续pop导致崩溃的问题解决

现在很多APP最低还是需要支持iOS7系统,而iOS7却有很多的BUG,其中NavigtaionController的Push和Pop 与iOS8及以后系统,有着不一样的处理。
今天在FirstViewController中使用了一个Block执行了[weakSelf.navigationController popToRootViewControllerAnimated:YES];,用来处理,当返回的值为空时就pop到上一个页面。

scanBarCodeVC.complete = ^(NSString *quthCodeStr) {
                
                if (0 >= [quthCodeStr length]) {
                    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                        [weakSelf.navigationController popToRootViewControllerAnimated:YES];
                    });
                    
                    return;
                }
                
                // TODO Others
            };

在SecondViewController中获取到quthCodeStr的值后,调用complete这个block

if (nil != self.complete) {
                self.complete(metadataObj.stringValue);
                self.complete = nil;
                
                __weak typeof(self) weakSelf = self;
                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                    [weakSelf.navigationController popViewControllerAnimated:YES];
                });
                
            } else {
                return;
            }

此时获取到了quthCodeStr回调完complete这个block后,就pop到上一个页面。** 此时在iOS7 的系统下就会崩溃** 会出现提示 Finishing up a navigation transition in an unexpected state. Navigation Bar 分析这个原因应该为

前一个pop还没有结束时,进行了另一个pop操作,而在iOS7系统中对此没有做优化,不能正常处理,所以崩溃了。


解决方法:

scanBarCodeVC.complete = ^(NSString *quthCodeStr) {
                
                if (0 < [quthCodeStr length]) {
                    // Must use this metod for compareing the ios7
                    NSMutableArray *vcs = [[NSMutableArray alloc] initWithArray:weakSelf.navigationController.viewControllers];
                    for (UIViewController *vc in vcs) {
                        if ([vc isKindOfClass:[weakSelf class]]) {
                            [vcs removeObject:vc];
                            
                            break;
                        }
                    }
                    
                    weakSelf.navigationController.viewControllers = vcs;
                }
                
                // TODO Others
            };

采用当pop的时候,先将当前的viewcontroller从navigationController中viewControllers数组里删除,然后在SecondViewController里跳转的时候,就直接回调到了FirstViewController的上一个VC中。

// END

你可能感兴趣的:(iOS7 连续pop导致崩溃的问题解决)