如何跳转到特定视图?

amo*_*mok 2 iphone cocoa-touch objective-c

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

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

self.statusView = [[StatusViewController alloc] initWithNibName:@"StatusViewController" bundle:nil];
[self.navigationController popToViewController:self.statusView animated:YES];
[self.navigationController popToViewController: 
Run Code Online (Sandbox Code Playgroud)

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

我要疯了...

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

Tyl*_*ler 7

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

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

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

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

UINavigationController* navController = self.navigationController;
UIViewController* controller = [navController.viewControllers objectAtIndex:0];
[navController popToViewController:controller animated:YES];
Run Code Online (Sandbox Code Playgroud)

如果你已经尝试过这个并且它不起作用,那么可能会出现一些问题:

  • 也许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]));
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 对您认为可见的导航控制器进行可视化操作以确保其实际可见.例如[navController.visibleViewController.view addSubview:aColorFulView];,aColorFulView某些地方在视觉上显而易见UIView.