Objective-C管理多个视图控制器

Objective-C管理多个视图控制器,objective-c,cocoa-touch,viewcontroller,Objective C,Cocoa Touch,Viewcontroller,我是Objective-C新手,我正在寻找一些关于如何管理多个视图控制器的建议。 我查阅了苹果公司关于其内置容器视图控制器类的文档,其中似乎没有一个是我要找的——最接近的是NavigationController,但即使是这样也有点不对劲 我想实现一系列ViewController——它们的接口使用XIB——根据一系列规则从一个视图控制器转换到下一个视图控制器。例如,在应用程序加载时,我们查看本地存储中是否有用户ID——如果没有,则显示注册屏幕。接下来,有一个按钮(比如说)叫出租车——如果点击该

我是Objective-C新手,我正在寻找一些关于如何管理多个视图控制器的建议。

我查阅了苹果公司关于其内置容器视图控制器类的文档,其中似乎没有一个是我要找的——最接近的是NavigationController,但即使是这样也有点不对劲

我想实现一系列ViewController——它们的接口使用XIB——根据一系列规则从一个视图控制器转换到下一个视图控制器。例如,在应用程序加载时,我们查看本地存储中是否有
用户ID
——如果没有,则显示注册屏幕。接下来,有一个按钮(比如说)叫出租车——如果点击该按钮,显示确认屏幕

可选的旁白:我认为这不适合导航控制器的原因是,流程似乎不是层次化的,而是分支和线性的。一个具体的例子是,我不需要导航条返回,这似乎是导航控制器的标准配置。但我对NavigationController了解不够,无法确定它是否适合这个用例

我一直在用各种方法破解这个问题。例如,在iAction处理程序中,我一直在使用以下代码转换到新的视图控制器:

UIViewController *view = [[UIViewController alloc] initWithNibName:@"CCWConfirmViewController" bundle:nil];
view.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:view animated:YES completion:nil];
另外,在我的窗口的'Root'ViewController(我将其设置为SignupViewController)initWithNibName中,我返回的视图控制器与请求的视图控制器不同,具体取决于我前面提到的本地存储调用的结果:

if (currentUser.userId) {

        // Instead of returning the SignupViewController, like was asked,
        // return the MainViewController, since signup isn't needed for existing
        // users.
        CCWMainViewController *mvc = [[CCWMainViewController alloc] init];
        return mvc;

我似乎一定是做错了什么(第二个黑客生成了一个警告,因为我返回了一个指向错误类型的指针)。有人知道更好的方法吗?导航控制器到底是为我设计的,而我只是误解了它的用途?我是否只需要实现一个自定义容器作为我的RootViewController并管理这些其他ViewController?

您的决定是正确的。您不需要导航控制器,但正如他们所说的。。有很多方法可以让你达到一个结果

“我不需要导航栏返回,这似乎是导航控制器上的标准配置”

您始终可以使用
self.navigationController.navigationBarHidden=YES

回到这一点上,我不会说你所做的是错误的,但会提出一个更好的方法,其中包括视图包含的概念

在cocoa touch中,可以将任何视图控制器添加为子视图控制器。这就是我的建议。 创建一个名为RootViewController的类,该类将始终被创建并设置为您的窗口,而不管用户是否登录。在该类的
viewDidLoad

-(void)viewDidLoad
{
   if (currentUser.userId) {
      CCWMainViewController *mvc = [[CCWMainViewController alloc] init];
      [self addChildViewController:mvc];
      mvc.view.frame = self.view.bounds;
      [self.view addSubview:mvc.view];  
   }
   else{
     //Create signup/login view and add to view as above.
   }
}

嘿,我真的很喜欢这个。编译器似乎不喜欢这样:[self.view addSubview:mvc.view.frame]--它应该是[self.view addSubview:mvc.view](末尾没有“frame”调用)吗?对不起,我的错!!复制粘贴的副作用:)你是对的,请看我编辑的我的答案。