popToViewController 不工作“试图弹出一个不存在的视图控制器”
Posted
技术标签:
【中文标题】popToViewController 不工作“试图弹出一个不存在的视图控制器”【英文标题】:popToViewController is not working "Tried to pop to a view controller that doesn't exist" 【发布时间】:2013-06-16 19:28:39 【问题描述】:我正在尝试使用 popToViewController,但我不断收到错误消息“尝试弹出到不存在的视图控制器”?
我在设置视图中,当用户单击“退出”时,我关闭了设置 VC 并转回到调用 unwind segue 方法的主视图。在 unwind segue 方法中,我调用了以下方法。
-(IBAction)endSettingsViaLogout:(UIStoryboardSegue *)segue
//[self performSegueWithIdentifier:@"mainToLoginSegue" sender:self];
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
//[self.navigationController popViewControllerAnimated:YES];
DLog(@"User finished with search");
当调用 poptoVC 时,我得到“试图弹出到不存在的视图控制器”。
我对 self.navigationController.viewControllers 进行 NSLog 记录,我可以看到 VC 的堆栈,而我想要弹出的堆栈在里面?
/// 更新 //////
好的,这就是我找到的。如果我对设置的转场是常规的“推送”转场,那么代码可以工作,我会被弹回到我想要的位置。如果我从屏幕左侧进行自定义转场,则它会停止工作。即使使用自定义 segue,self.navigationcontroller.viewcontrollers 也会在堆栈中显示它。那么为什么我不能弹回它呢?或者我怎样才能使用自定义转场回到它?
【问题讨论】:
这在很大程度上取决于您的自定义 segue 对堆栈执行的操作以及调用popToViewController:
时视图控制器是否仍在堆栈中@ segue 何时调用?在你的 popToViewController 之前还是之后?如果 segue 已经将用户带回主屏幕,为什么还要尝试弹出视图控制器?更多详细说明您的转场和事件顺序的代码将有很大帮助。
【参考方案1】:
我的视图控制器层次结构正确吗?
根据您的 UINavigationViewController,您已将主视图控制器设置为根视图控制器。 然后设置视图控制器已被推送到此。 通过“退出”设置视图控制器被重新连接到主视图控制器。如果是这样,您实际上是在尝试“返回”到不存在的视图控制器,因为您已经到达导航控制器堆栈的根视图控制器。在这种情况下,所有先前初始化的控制器都已从堆栈中弹出,您必须重新初始化并推送所需的视图控制器。
如果我遗漏了一些重要的点,如果您能在“退出”选项可用时描述您的实际视图控制器堆栈,那将会很有帮助。此外,如果您记录 self.navigationController.viewControllers 数组,控制台上究竟会打印什么?
【讨论】:
【参考方案2】:这基本上告诉 objectatindex 1 不存在:
要尝试的事情:
objectatindex:0
或
nslog(@"%d",[[self.navigationController.viewControllers]count]);//add it before the popline and see if it works
如果是顶视图控制器,请尝试以下操作:
改为[navigationController topViewController]
【讨论】:
请看我的最后一句话。我想要的视图控制器在那里并且它存在。做“po self.navigationController.viewcontrollers”我在列表中看到它。我可以做 [self.navigationController.viewcontrollers objectAtIndex:1] 和它那里。 当你自定义 segue 时...你是在使用 self.navigationcontroller 吗?【参考方案3】:NSArray *viewControllers = [[self navigationController] viewControllers];
for( int i=0;i<[viewControllers count];i++)
id obj=[viewControllers objectAtIndex:[viewControllers count]-i-1];
if([obj isKindOfClass:[OrderCheckOutViewController class]])
[[self navigationController] popToViewController:obj animated:YES];
return;
【讨论】:
【参考方案4】:您可以使用 sn-p 弹出到导航控制器堆栈中 targetVC 的下一个视图控制器。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
BOOL findIt = NO;
UIViewController *targetVC = nil;
for (UIViewController *subVC in self.navigationController.viewControllers)
if (findIt)
break;
if (subVC == xxx)
findIt = YES;
else
targetVC = subVC;
[self.navigationController popToViewController:targetVC animated:NO];
);
【讨论】:
以上是关于popToViewController 不工作“试图弹出一个不存在的视图控制器”的主要内容,如果未能解决你的问题,请参考以下文章
斯威夫特 3:popToViewController 不工作
navigationController popToViewController 不能在 swift 3 中工作
applicationDidEnterBackground 触发 popToViewController