推送和删除FromParentControllers,影响导航控制器

时间:2017-07-27 04:29:41

标签: ios objective-c uiviewcontroller uinavigationcontroller uistoryboardsegue

enter image description here

以上链接上的图片,不能将其包含在帖子中.. 当我从viewControllerA推送到B,然后我从B推送到C,然后我使用以下代码删除viewControllerB并将C推送到B并删除viewControllerC:

    NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers];

    for(UIViewController *tempVC in navigationArray)
{
    if([tempVC isKindOfClass:[viewControllerB class]])
    {
        [tempVC removeFromParentViewController];
    }
}

    [self performSegueWithIdentifier:@"toViewControllerB" sender:self];

    for(UIViewController *tempVC in navigationArray)
    {
        if([tempVC isKindOfClass:[viewControllerC class]])
        {
            [tempVC removeFromParentViewController];
        }
    }

所以现在ViewControllerA连接到最后一个ViewControllerB 之后我仍然在导航栏中看到后退按钮,但是在我按下它的后退按钮之后,ViewControllerB弹回到ViewControllerA,但是在ViewControllerA中,导航栏项目和标题都消失了,我故意从C推送到B再次修复一些内存问题,如何通过取出中间的两个视图控制器但不搞乱导航控制器来完成这项工作?有没有其他选择来完成这项工作?谢谢 我有另一个奇怪的方法是以编程方式创建一个带有相同项目和标题的导航栏来覆盖它,但看起来似乎错了......

2 个答案:

答案 0 :(得分:0)

首先,当你想从B推送到C然后删除B时,你可以尝试这个

for(UIViewController *tempVC in navigationArray)
{
    if([tempVC isKindOfClass:[viewControllerB class]])
    {
        [navigationArray removeObject:tempVC];
        break;
    }
}
[self.navigationController setViewControllers:navigationArray];
[self performSegueWithIdentifier:@"toViewControllerB" sender:self];

但是你必须确保segue从C到B.然后你将得到控制器A-> C-> B。如果你想推送到ControllerC并删除Last C.尝试使用相同的功能。

答案 1 :(得分:0)

1)当您第一次从B推送到C控制器时,首先删除B控制器 2)当您从C控制器推送到B控制器时,然后移除C控制器。

//从堆栈中删除C语言控制器的代码

NSArray * viewControllers = self.navigationController.viewControllers;

NSMutableArray *viewControllersMutable = [NSMutableArray arrayWithArray:viewControllers];
for (UIViewController *vc in viewControllers) {
    if (([viewControllers indexOfObject:vc] != viewControllers.count - 1 ) && [vc isKindOfClass: C.class] ){
        NSLog(@"removing contoller of kind C");
        [viewControllersMutable removeObject:vc];
    }
}

self.navigationController.viewControllers = viewControllersMutable.copy;

//删除B控制器的代码

NSArray * viewControllers = self.navigationController.viewControllers;

NSMutableArray *viewControllersMutable = [NSMutableArray arrayWithArray:viewControllers];
for (UIViewController *vc in viewControllers) {
    if (([viewControllers indexOfObject:vc] != viewControllers.count - 1 ) && [vc isKindOfClass: B.class] ){
        NSLog(@"removing contoller of kind B");
        [viewControllersMutable removeObject:vc];
    }
}

self.navigationController.viewControllers = viewControllersMutable.copy;

注意 - >您可以在同一代码中执行此操作仅选中“OR”条件,表示控制器为B或C.