如何在不使用标签栏的情况下在视图控制器之间切换?

时间:2010-03-05 13:37:37

标签: iphone objective-c uiviewcontroller uinavigationcontroller uitabbarcontroller

我有一个UINavigationController。在我的层次结构的第二级,我想显示一个带有工具栏的视图控制器,我在其中插入了一个分段控件。通过它,用户可以在同一页面的两个“视图”之间进行选择,我们可以调用A和B(就像在日历应用程序中一样)。

当用户按A段时,必须显示A视图。当用户按下B段时,必须显示B视图。

A和B是复杂的视图,所以我更喜欢在两个名为AViewController和BViewController的独立视图控制器中管理它们。

最初我曾想过在UITabBarViewController中插入AViewController和BViewController,但是在pushViewController:animated:官方文档中我读到推送的视图控制器“不能是标签栏控制器的实例。”

你知道如何在不使用UITabBarViewController的情况下在AViewController和BViewController之间切换吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

您可能希望查看UISegmentView,它会为您提供一些可用于更改视图内容的按钮。

另一种选择是使用Info按钮,在视图之间有一个很好的翻转过渡。

第三个选项是让一个工具栏按钮将你的第二个视图作为一个模态视图,并在该屏幕上有一个关闭按钮,自动解除。

技术答案

创建一个容器视图控制器,用于保存UISegment视图和2个视图控制器实例变量AViewControllerBViewController。同样在主视图控制器中,有一个容器视图,用于为子视图设置适当的框架。在viewDidLoad中实例化它们,但仅显示当前选择的那个......

-(void)showAppropriateView {

     if([segment selectedIndex] == A_VIEW_SEGMENT) {
         [self.containerView addSubView:aViewController.view];
         [bViewController.view removeFromSuperView];
     } else {
         [self.containerView addSubView:bViewController.view];
         [aViewController.view removeFromSuperView];
     }
}

UISegmentView更改时调用此方法。

答案 1 :(得分:2)

我会将您的两个视图添加为视图的子视图(称为rootView)并使用bringSubviewToFront来显示它们:

// display view A
[rootView bringSubviewToFront:AViewController.view];

// display view B
[rootView bringSubviewToFront:BViewController.view];