【问题标题】:Issue while remove viewController from navigation stack从导航堆栈中删除 viewController 时出现问题
【发布时间】:2015-05-31 13:42:51
【问题描述】:

我正在制作演示,其中我必须从 NavigationController 中删除一些 viewController,为此我已经在下面的代码中实现了,但它给了我问题。

我已经推送了 VC1,VC2,VC3,现在我想推送 VC4 并移除 VC2...

ViewController4 *VC4=[[ViewController4 alloc]initWithNibName:@"ViewController4" bundle:nil];
[self.navigationController pushViewController:VC4 animated:YES];

NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]];

for(UIViewController *objVC in viewControllers)
{
    if([objVC isKindOfClass:[ViewController2 class]])
    {
        [viewControllers removeObjectIdenticalTo:objVC];
    }
}
self.navigationController.viewControllers =viewControllers ;

此代码适用于 iOS8,但在带有 VC2 的 iOS7 中,当我在 VC4 中按下后退按钮时,VC3 也会自动删除。 即使我把代码放在下面,控制器也会自动从堆栈中删除。

ViewController4 *VC4=[[ViewController4 alloc]initWithNibName:@"ViewController4" bundle:nil];
[self.navigationController pushViewController:VC4 animated:YES];

NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]];

self.navigationController.viewControllers =viewControllers ;

【问题讨论】:

  • 问题一:你是在推VC4的时候还是从VC4回来的时候删除VC2?
  • 问题 2:当你从 VC4 回来时,VC2 和 VC3 从堆栈中移除,对吗?
  • 在你推送 VC4 之后,你能把所有的视图控制器都记录在导航堆栈中并检查堆栈中是否有 VC4 吗?
  • Ans1 : 我想在推 VC4 后删除 VC2。 Ans2:是的,当我从 VC4 按下返回时,我直接来到 VC1,因为我删除了 VC2,VC3 自动删除。 Ans3:在推送 VC4 并删除 VC2 后,我可以在 NSLog 中获得所需的堆栈 VC1、VC3、VC4。即使在 VC4 NSLog 的 viewWillAppear 中也是一样的,但是在 VC4 的 viewDidAppear 中它只打印 VC1,VC4。
  • 谢谢!还可以检查我的第三条评论,在执行删除操作之前记录视图控制器

标签: ios objective-c uinavigationcontroller pushviewcontroller


【解决方案1】:

这是修复,在 iOS7 和 iOS8 中运行良好:

NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]];

    // Find the things to remove
        NSMutableArray *toDelete = [NSMutableArray array];

    for(UIViewController *objVC in viewControllers)
    {
        if([objVC isKindOfClass:[ViewController2 class]])
        {
            [toDelete addObject:objVC];
        }
    }
    [viewControllers removeObjectsInArray:toDelete];
    self.navigationController.viewControllers =viewControllers ;

ViewController4 *VC4=[[ViewController4 alloc]initWithNibName:@"ViewController4" bundle:nil];
[self.navigationController pushViewController:VC4 animated:YES];

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 1970-01-01
    • 2018-04-12
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多