2014-04-12 162 views
0

推视图控制器后后退按钮不回去

UIViewController *vc = [[self storyboard] instantiateViewControllerWithIdentifier:@"frontCardViewController"]; 
[self.navigationController pushViewController:vc animated:YES]; 

我删除所有ViewControllers我不需要再使用此代码

NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
NSArray *array = [[NSArray alloc] initWithArray:navigationArray]; 
for (UIViewController *viewController in array) { 
    if ([viewController isKindOfClass:[RITCardViewController class]]) { 
      RSLog(@"Is kind of Class RITCardViewController"); 
      [navigationArray removeObject:viewController]; 
    } 
} 
self.navigationController.viewControllers = navigationArray; 

导航阵列现在看起来像这个:

"RITMainViewController: 0x10d81fc1>", 
"RITDetailViewController: 0x10d847880", 
"RITTestResultViewController: 0x113d0e090" 

但问题是,如果现在按导航栏中的后退按钮,它回到第二个屏幕。但是当后退按钮再次按下时,它只会停留在此屏幕上。它似乎通过我已经删除的所有屏幕,但不显示它们。

我在做什么错?

+1

导航控制器的要点是将新控制器推入堆栈,并允许用户通过点击后退按钮返回堆栈。你永远不应该手动删除那些不再可见的。 从导航堆栈中移除控制器永远不会工作;你正在腐蚀它的内部状态,它肯定会变得无望地混淆。这也会产生糟糕的用户体验;人们期望导航能够以他们习惯的方式工作。 – davidf2281

+0

@ davidf2281你错在认为它破坏了内部状态。过去我做得很成功。然而,您在强调应用程序的用户体验时非常正确。 – bsarrazin

+1

我同意@ bensarz的建议。但是,根据acutal导航逻辑,使用'popToViewController:animated:'可能是一个选项。 –

回答

3

尝试这样代替:

NSMutableArray *viewControllers = [@[] mutableCopy]; 
for (UIViewController *vc in self.nagivationController.viewControllers) 
{ 
    if (NO == [vc isKindOfClass:[RITCardViewController class]]) 
     [viewControllers addObject:vc]; 
} 
self.navigationController.viewControllers = viewControllers; 

确保您通过删除您目前从视图控制器阵列的视图控制器不会破坏堆栈。假设你当前的视图控制器不是RITCardViewController的实例,你应该没问题。否则,你必须在你的代码中弥补它。