现在很多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