Ios popToViewController不工作“;试图弹出到不显示';“不存在”;
我正在尝试使用popToViewController,但我不断收到错误“试图弹出到不存在的视图控制器” 我在设置视图中,当用户单击“注销”时,我将关闭设置VC并返回到主视图,在主视图中调用一个unwind segue方法。在unwindsegue方法中,我调用以下命令Ios popToViewController不工作“;试图弹出到不显示';“不存在”;,ios,objective-c,segue,poptoviewcontroller,Ios,Objective C,Segue,Poptoviewcontroller,我正在尝试使用popToViewController,但我不断收到错误“试图弹出到不存在的视图控制器” 我在设置视图中,当用户单击“注销”时,我将关闭设置VC并返回到主视图,在主视图中调用一个unwind segue方法。在unwindsegue方法中,我调用以下命令 -(IBAction)endSettingsViaLogout:(UIStoryboardSegue *)segue { //[self performSegueWithIdentifier:@"mainToLoginSegue
-(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,我可以看到VC的堆栈,我想弹出的堆栈就在那里?
///更新//////
好的,这是我发现的。如果我的segue to Settings是一个常规的“push”segue,那么代码会工作,我会弹出到我想要的地方。如果我做了一个自定义的segue,来自屏幕的左侧,那么它将停止工作。即使使用自定义segue,self.navigationcontroller.viewcontrollers也会在堆栈中显示其属性。那为什么我不能回到过去呢?或者如何使用自定义segue返回到它?我是否正确获得视图控制器层次结构
- 在UINavigationViewController的基础上,您已将主视图控制器设置为根视图控制器
- 然后在此基础上推送设置视图控制器
- 通过“注销”,设置视图控制器被分回到主视图控制器
如果我遗漏了一些重要的观点,如果您能在“注销”选项可用时描述您的实际视图控制器堆栈,这将非常有用。此外,如果您记录self.navigationController.viewControllers数组,控制台上到底打印了什么 这基本上说明objectatindex 1不存在: 尝试的事项:
objectatindex:0
或
如果是topview控制器,请尝试以下操作:
[navigationController-topViewController]
取而代之的是NSArray*viewControllers=[[self-navigationController]viewControllers];
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;
}
}
对于(int i=0;i,您可以使用该代码段弹出到navigationController堆栈中targetVC的下一个viewController
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];
});
请看我的最后一句话。我想要的视图控制器在那里并且存在。执行“po self.navigationController.viewcontrollers”可以在列表中看到它。我可以执行[self.navigationController.viewcontrollers objectAtIndex:1]当你使用自定义segue时…你是在使用self.navigationcontroller吗?这在很大程度上取决于你的自定义segue对堆栈做了什么,以及当你调用popToViewController:
segue何时调用?在popToViewController之前还是之后?如果ue已经将用户带回主屏幕,为什么您要尝试弹出视图控制器?更多详细说明您的序列和事件顺序的代码将非常有帮助。
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];
});