0

我正在打破 UINavigationController 的正常范式,或者至少我正在尝试这样做。

我们知道导航控制器通过堆栈管理导航。如果我使用根控制器 A 进行初始化,导航到 B,然后导航到 C,堆栈将看起来像 - C/B/A。

不过,我想做的是在视图 C 上有一个按钮,该按钮将显示另一个视图,比如 X,但仍将导航控制器的导航栏保持在原位。本质上,在堆栈上切换“C”和“X”。我试图通过弹出 C 并立即按下 X 来实现这一点,如下所示,但它不起作用。我在这里走错路了吗?

-(IBAction)showViewX:(id)sender {
[[self.parentViewController navigationController] popViewControllerAnimated:NO];

XViewController *xViewController = [[XViewController alloc]
        initWithNibName:@"X" 
        bundle:[NSBundle mainBundle]];
[[self.parentViewController navigationController] pushViewController: xViewController animated:YES];
[xViewController release];  
}
4

3 回答 3

2

你所说的“视图 C”实际上是“视图控制器 C”。由于它是一个视图控制器,您可以轻松地将其设置为在两个视图 X 和 Y 之间切换。所以您只需将 C 留在堆栈中,不要弹出它,然后在 C 本身的视图之间切换。例如,您可以将 C 设置为使用工具栏在视图之间切换。

于 2009-04-27T21:21:24.387 回答
1

可能是您真的没有尝试执行 UINavigationController 旨在支持的那种导航。在您的示例中,您的用户如何从视图 X 回到视图 C?

UINavigationController 旨在允许基本的向前/向后导航。如果您有更复杂的导航需求,则必须构建自己的导航系统。看看一些更复杂的 Apple 应用程序(邮件和 Safari)是如何进行导航的——也许其中有一些有用的东西?

于 2009-04-27T20:21:58.603 回答
1

(看上面的澄清评论,我误解了原始问题的目标,更好的方法是从 View C 本身管理 View X 或 View C 的显示,根据需要切换,而不是在全部。)

由于您想保留导航控制器栏,但您不希望能够从“X”返回到“C”(我假设“X”之外还有其他路径)那么您可以执行以下操作:

self.navigationItem.hidesBackButton = YES;

从 ViewController X 内部,在viewDidLoad方法内部。

X 仍在堆栈中,C 仍在堆栈中,但您获得了所需的视觉表示。

否则,您可能需要滚动一个新的 NavigationContoller,将 X 弹出到它的堆栈上,然后跳转到它,将旧堆栈(和 ViewController)留在后面。

于 2009-04-27T21:21:12.017 回答