iOS视图层次结构和嵌套的navigationcontrollers

时间:2013-05-02 22:21:55

标签: ios model-view-controller uinavigationcontroller

我在我的应用程序的根目录中有3个viewcontroller / views: LoginViewController HomeViewController PlayViewcontroller

我正在寻找的是基于状态在这三者之间进行交换的好方法(例如:成功登录会导致loginViewcontroller ping其委托[rootviewcontroller]以移除自身并显示homeviewcontroller)

我似乎有两个选择:

1.RootViewController是一个UIViewController。它根据需要添加/删除子视图。

[self.view addSubview:loginViewController.view];

2.RootViewController是一个UIViewController。它根据需要以模态方式显示/删除视图。

[self presentViewController:loginViewcontroller animated:NO completion:nil];

3.RootViewController是一个UINavigationController。它推动/弹出东西。

[self pushViewcontroller:loginViewController];

我已经读过,第一个选项是关于viewcontroller应该是什么的整个想法,因此并不理想。

第二个选项看起来很奇怪,因为我的整个应用程序都是模态的? viewcontrollers可以在模态呈现的viewcontrollers之上进行模态显示吗?

第三种选择似乎最好,(如here所述),但是我的具体实施遇到了一些问题:

  • “navigationController”的比喻并不完全适合(我不是通过登录来“钻进家庭控制器”)。
  • 我是否经常关闭navController的rootviewcontroller?或者我只是在loginvc之上将playvc推送到homevc之上?
  • LoginVC本身就是一个navigationViewController--它推动了经历创建帐户的多步骤过程的vc,我无法在navcontrollers上推送navcontrollers。

所以,我的问题是:

在其中一些是UINavigationControllers本身时,在同等层次结构中构建视图控制器的最佳方法是什么?

****注意:***我已经看了here,但它没有为我的用例(多个导航控制器)提供足够的答案。*******


编辑:我找到了答案:我认为问题是错误的,而应该考虑创建我自己的Container ViewController

3 个答案:

答案 0 :(得分:2)

我认为你应该考虑2和3的组合。由于登录是会话中的一次性事情,最好不要让这些控制器一直处于活动状态 - 更好地使用它们,然后拥有它们走开。为此,我将使窗口的根视图控制器成为导航控制器,HomeViewController作为其根,并推送到PlayViewController。 LoginViewController应该以模态方式呈现,来自HomeViewController中的viewDidAppear方法,因此它将在应用程序首次打开时显示(如果您关闭了动画)。可以以模态方式呈现导航控制器,它将覆盖您的根导航控制器,因此您将看不到两个导航栏。

答案 1 :(得分:2)

  

viewcontrollers可以在模态呈现的基础上进行模态显示   viewcontrollers?

我不认为您的根控制器是以模态方式呈现的。根控制器由应用程序窗口拥有。你不能像解雇模态控制器那样解雇它。

IMO,只需将您的登录控制器显示为模态视图控制器,并在用户成功通过身份验证后将其关闭。

答案 2 :(得分:0)

我今天遇到了同样的问题,然后我重新构建了一个UITabBarController来理解这一点(UITabBarController是使用Container viewcontroller构建的,包括几个navigationcontroller)。我刚刚在这里添加了代码https://github.com/damienromito/CustomTabBarController

关于这方面的Apple文档在这里:https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html