我在我的应用程序的根目录中有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所述),但是我的具体实施遇到了一些问题:
所以,我的问题是:
****注意:***我已经看了here,但它没有为我的用例(多个导航控制器)提供足够的答案。*******
编辑:我找到了答案:我认为问题是错误的,而应该考虑创建我自己的Container ViewController。
答案 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