在两个UIViewController堆栈之间转换

时间:2013-10-24 06:56:50

标签: ios objective-c uiviewcontroller appdelegate

我计划在我的App中在App Delegate中设置一个根UIViewController,它基本上分为两个UIViewControllers,每个UIViewControllers都有一个数字UINavigationControllers被推到他们身上,可能有一个UITabBarController,还不太确定,但主要问题是我想从任何视图转移从一个UIViewController堆栈到另一个,并维护视图层次结构。

当我想从一个UIViewController堆栈更改为另一个堆栈时,我考虑过调用App委托:

MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate];
[appDelegate.viewController someMethod];

并以这种方式转换,但这似乎是一种hacky方式。还考虑将引用通过堆栈传递给根UIViewController并调用方法在UIViewControllers之间进行更改。

哪种方式会更好?或者有没有一种方法我没有想过这是首选方式?

2 个答案:

答案 0 :(得分:1)

UITabBarController为您提供完全相同的功能。如果您有一个作为根视图控制器,并且每个选项卡中有两个带有导航控制器的选项卡,那么您基本上已经完成了。如果您不想在底部显示标签栏,则可以隐藏它,然后在某些事件后触发代码中的标签切换。它很直接:)

答案 1 :(得分:1)

你的意思是你有一个根视图控制器,这个根VC管理两个视图控制器,这两个控制器管理很多子视图控制器?

如果是这样,您可以尝试使用自定义包含控制器。每次你想要将堆栈从一个堆栈更改为另一个堆栈时,只需委托rootVC来执行此操作。

- (void)moveToAnotherController:(UIViewController *)vc
{
    [self displayContentController:vc];
}

- (void)displayContentController:(UIViewController *)content
{
    [self addChildViewController:content];
    [self.view addSubview:content.view];
    [content.view setFrame:self.view.bounds];
    [content didMoveToParentViewController:self];

}

//remove child controller from container
- (void)hideContentController:(UIViewController *)content animated:(BOOL)animated
{
    [content willMoveToParentViewController:nil];
    [content.view removeFromSuperview];
    [content removeFromParentViewController];
}