如何跳转到特定视图?

时间:2009-09-14 21:56:19

标签: iphone objective-c cocoa-touch

我有3个视图(xib'd)第三个视图打开一个模态视图(也是xib'd)。 我的目标是处理模态视图并跳转到视图#1。

我使用了以下代码,但它什么也没做。

self.statusView = [[StatusViewController alloc] initWithNibName:@"StatusViewController" bundle:nil];
[self.navigationController popToViewController:self.statusView animated:YES];
[self.navigationController popToViewController: 

我也尝试了以下相同的结果。 [self.navigationController.viewControllers objectAtIndex:0] animated:YES];

我疯了......

statusView有一个定期合成的访问器,它代表我想要跳转到的视图。

2 个答案:

答案 0 :(得分:7)

根据您目前所说的内容,您的观点是如何相互建立的并不完全清楚。

我猜你有一个导航控制器,以及导航堆栈上显示的3个视图控制器。

如果是这种情况,并且您希望一次弹出两个屏幕(从#3到#1,跳过#2),那么您需要一个指向视图控制器的指针# 1(不是视图本身)。看起来您的问题中的第一个popViewController:方法调用正在视图中发送。

弹出到第一个视图控制器的示例代码:

UINavigationController* navController = self.navigationController;
UIViewController* controller = [navController.viewControllers objectAtIndex:0];
[navController popToViewController:controller animated:YES];

如果你已经尝试过这种方法,但它不起作用,可能会出现一些问题:

  • 也许self.navigationController实际上不是正确的对象。
  • 也许您期望的视图实际上不是导航堆栈上的#0视图。
  • 也许您正在使用的导航控制器当前不可见。

您可以采取以下一些步骤来测试这些假设:

  • 当您第一次分配要使用的导航控制器时,请致电NSLog(@"Nav controller is at %p", navController);并在此代码中添加对NSLog(@"Now my navController is at %p", navController);的调用,并检查地址是否匹配。
  • 如果导航控制器是正确的,则打印出当前导航堆栈;这样的事情(假设每个视图控制器都有不同的类名):

    for (UIViewController* viewController in navController.viewControllers) {
      NSLog(@"%s", class_getName([viewController class]));
    }
    
  • 对您认为可见的导航控制器进行可视化操作以确保其实际可见。例如[navController.visibleViewController.view addSubview:aColorFulView];其中aColorFulView在视觉上显而易见UIView

答案 1 :(得分:1)

-popToViewController允许您将控制器弹出堆栈。你想要做的是新的viewControllers推送到堆栈上,所以使用:

[self.navigationController pushViewController: self.statusView animated: YES];