2

我的应用程序的根目录中有 3 个视图控制器/视图:LoginViewControllerHomeViewControllerPlayViewcontroller

我正在寻找的是一种基于状态在这三个之间进行交换的好方法(例如:成功登录将导致 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];

我读过第一个选项有点围绕视图控制器应该是什么的整个想法,因此并不理想。

第二个选项似乎很奇怪,因为我的整个应用程序都是模态的?视图控制器可以模态呈现在模态呈现的视图控制器之上吗?

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

  • “navigationController”的隐喻并不完全适合(我不是通过登录“深入了解家庭控制器”......)
  • 我是否经常切换 navController 的 rootviewcontroller?还是我只是将playvc 推到loginvc 之上的homevc 之上?
  • LoginVC 本身就是一个导航视图控制器——它推动了 vc 的创建帐户的多步骤过程,我不能在 navcontrollers 上推动 navcontrollers。

所以,我的问题是:

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

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


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

4

3 回答 3

2

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

于 2013-05-02T23:27:18.147 回答
2

视图控制器可以模态呈现在模态呈现的视图控制器之上吗?

是的。

我不会认为您的根控制器是以模态方式呈现的。根控制器归您的应用程序窗口所有。您不能像解散模态呈现的控制器一样解散它。

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

于 2013-05-03T05:15:30.923 回答
0

我今天遇到了同样的问题,然后我重新构建了一个 UITabBarController 来理解这一点(UITabBarController 是用包含几个导航控制器的容器视图控制器构建的)。我刚刚在这里添加了代码https://github.com/damienromito/CustomTabBarController

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

于 2014-02-22T01:39:45.670 回答