【问题标题】:popToViewController is not working "Tried to pop to a view controller that doesn't exist"popToViewController 不工作“试图弹出一个不存在的视图控制器”
【发布时间】: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 已经将用户带回主屏幕,为什么还要尝试弹出视图控制器?更多详细说明您的转场和事件顺序的代码将有很大帮助。

标签: ios objective-c segue poptoviewcontroller


【解决方案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];
      });
      

      【讨论】:

        猜你喜欢
        • 2011-01-28
        • 2014-02-04
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多