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

时间:2014-05-07 02:38:36

标签: objective-c cocoa-touch viewcontroller

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

我查看了Apple内置的容器视图控制器类的文档,但它们似乎都不是我想要的 - 最接近的是NavigationController,但即使这样看起来有点偏。 / p>

我想实现一系列ViewControllers - 它们使用xib作为它们的接口 - 根据一系列规则从一个转换到下一个。例如,在应用加载时,我们会看到本地存储中是否有userId - 如果不是,请显示注册屏幕。接下来,有一个按钮(比如说)订购出租车 - 如果单击该按钮,则显示确认屏幕。

可选旁白:我认为这不适合导航控制器的原因是流程似乎不是分层的,而是一种分支和线性的。一个具体的例子就是我不需要导航栏就可以返回,这似乎是导航控制器的标准配置。但我不太清楚NavigationController是否足以确定它是否适合这个用例。

我一直用各种方法来攻击它。例如,在IBAction处理程序中,我一直在使用此代码转换到新的视图控制器:

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并管理这些其他ViewControllers吗?

1 个答案:

答案 0 :(得分:1)

你的决定是对的。您不需要为您的目的使用导航控制器,但正如他们所说的那样。您可以通过多种方式获得结果。

  

"我不需要导航栏可以返回,这似乎是导航控制器的标准配置"

您始终可以使用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.
   }
}