最近發現一個 bug,setViewControllers:animated: 不生效
復現場景:
需要刪除 上一個 controller,于是在 viewDidAppear 中
NSMutableArray *array = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
if (_removePreviousControllerCount < array.count-1) {
self.hidesBottomBarWhenPushed = YES;
[array removeObjectsInRange:NSMakeRange(array.count -1 - _removePreviousControllerCount, _removePreviousControllerCount)];
[self.navigationController setViewControllers:array animated:NO];
}
但是如果這時候彈出一個 UIAlertController 的話,那么 這個設置就不生效了。這個網上也沒有人發現是什么問題。于是自己想了一個解決方案,在 alertController 消失的時候,再來刪除一次。
但是在 iOS8 系統上面沒有這個問題。所以再次刪除的時候,還需要判斷前面是否真的已經刪除成功
- (void)viewDidLoad
{
...
self.origionViewControllers = [self viewControllers];
...
}
#pragma mark - viewcontrollers
- (BOOL)isRemoveSuccess
{
if (_removePreviousControllerCount > 0) {
NSArray *current = [self viewControllers];
if ([self isViewControllers:current equalTo:self.origionViewControllers]) {
// 一樣,說明沒有刪除成功
return NO;
}
}
return YES;
}
- (BOOL)isViewControllers:(NSArray<NSString *> *)arr1 equalTo:(NSArray<NSString *> *)arr2
{
if (arr1.count != arr2.count) {
return NO;
}
for (int i = 0; i<arr1.count; i++) {
NSString *vc1 = arr1[i];
NSString *vc2 = arr2[i];
if (![vc1 isEqualToString:vc2]) {
return NO;
}
}
return YES;
}
- (NSArray<NSString *> *)viewControllers
{
NSMutableArray *mutArr = [[NSMutableArray alloc] init];
for (int i = 0; i < self.navigationController.viewControllers.count; i++) {
UIViewController *vc = self.navigationController.viewControllers[i];
NSString *address = [NSString stringWithFormat:@"%@",vc];
[mutArr addObject:address];
if (vc == self) {
// 后面的就先不管了。
break;
}
}
return mutArr;
}
- (void)removeViewControllers
{
if (_removePreviousControllerCount > 0) {
NSMutableArray *array = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
if (_removePreviousControllerCount < array.count-1) {
self.hidesBottomBarWhenPushed = YES;
[array removeObjectsInRange:NSMakeRange(array.count -1 - _removePreviousControllerCount, _removePreviousControllerCount)];
[self.navigationController setViewControllers:array animated:NO];
}
}
}