iOS视图层次结构和嵌套导航控制器

iOS视图层次结构和嵌套导航控制器,ios,model-view-controller,uinavigationcontroller,Ios,Model View Controller,Uinavigationcontroller,我的应用程序根目录中有3个viewcontroller/视图:LoginViewController、HomeViewController和PlayViewcontroller 我要寻找的是一种基于状态在这三者之间切换的好方法(例如:成功登录将导致loginViewcontroller ping其委托[rootviewcontroller]以删除自身并显示homeviewcontroller) 我似乎有两个选择: 1.RootViewController是一个UIViewController。它

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

我要寻找的是一种基于状态在这三者之间切换的好方法(例如:成功登录将导致loginViewcontroller ping其委托[rootviewcontroller]以删除自身并显示homeviewcontroller)

我似乎有两个选择:

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

[self.view addSubview:loginViewController.view];
[self presentViewController:loginViewcontroller animated:NO completion:nil];
2.RootViewController是一个UIViewController。它根据需要以模式显示/删除视图

[self.view addSubview:loginViewController.view];
[self presentViewController:loginViewcontroller animated:NO completion:nil];
3.RootViewController是一个UINavigationController。它推动/弹出东西

[self pushViewcontroller:loginViewController];
我已经读到第一个选项是围绕着viewcontroller应该是什么的整个想法工作的,因此并不理想

第二个选项看起来很奇怪,因为我的整个应用程序都是模态的?viewcontrollers是否可以在modally presented viewcontrollers上以模式显示

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

  • “navigationController”的比喻并不完全合适(我不是通过登录来“深入了解主控制器…”
  • 我是否经常关闭navController的rootviewcontroller?或者我只是把playvc推到loginvc上的homevc上
  • LoginVC本身就是一个navigationViewController——它推送经过多步创建帐户过程的vc,而我不能推送NavController上的NavController
所以,我的问题是:

当某些视图控制器本身是UINavigationController时,在同等层次上构建视图控制器的最佳方法是什么? ****注:**我已经看过了,但它没有为我的用例(多个导航控制器)提供足够的答案*******



编辑:我找到了一个答案:我对这个问题的想法是错误的,应该从创造自己的角度来思考 viewcontrollers可以在MODALY PRESSED之上以MODALY方式呈现吗 视图控制器

我不会认为您的根控制器是以模式呈现的。根控制器由应用程序窗口拥有。您不能像关闭模式显示的控制器一样关闭它

在我看来,只要将您的登录控制器显示为模态视图控制器,并在用户成功进行身份验证后将其关闭即可

viewcontrollers可以在MODALY PRESSED之上以MODALY方式呈现吗 视图控制器

我不会认为您的根控制器是以模式呈现的。根控制器由应用程序窗口拥有。您不能像关闭模式显示的控制器一样关闭它


在我看来,只要将您的登录控制器显示为模式视图控制器,并在用户成功进行身份验证后将其关闭。

我今天遇到了同样的问题,然后我重新构建了一个UITabBarController以了解这一点(UITabBarController是使用包含多个navigationcontroller的容器viewcontroller构建的)。我刚刚在这里添加了代码


关于这一点的苹果文档如下:

我今天遇到了同样的问题,然后我重新构建了一个UITabBarController来理解这一点(UITabBarController是使用包含多个navigationcontroller的容器viewcontroller构建的)。我刚刚在这里添加了代码


关于这一点的苹果文档在这里:

好的。。。因此,我用我的RootViewController(UIViewController)将其设置为窗口的RootViewController,我希望它在应用程序启动后立即“显示”我的loginViewController。当我将“[self-presentViewController:loginViewController…]”放在ViewDid中时,它才显示出来,这是不是很奇怪?(如果我将其放在viewDidLoad或viewWillAppear中,它不会显示…)这是否意味着我需要在viewDidAppear中执行所有的显示/删除操作?这似乎很奇怪。。。想法?@Phildo-present只能在显示自己视图的控制器上工作,所以这是正常的。您可以尝试在ViewWillDisplay:,我想它可能会起作用。好的。。。因此,我用我的RootViewController(UIViewController)将其设置为窗口的RootViewController,我希望它在应用程序启动后立即“显示”我的loginViewController。当我将“[self-presentViewController:loginViewController…]”放在ViewDid中时,它才显示出来,这是不是很奇怪?(如果