【问题标题】:Objective-C Manage Several View ControllersObjective-C 管理多个视图控制器
【发布时间】:2014-05-07 02:38:36
【问题描述】:

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

我查看了 Apple 关于其内置容器视图控制器类的文档,但它们似乎都不是我想要的——最接近的是 NavigationController,但即使这样似乎也有点偏离。

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

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

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

UIViewController *view = [[UIViewController alloc] initWithNibName:@"CCWConfirmViewController" bundle:nil];
view.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:view animated:YES completion:nil];

此外,在我的窗口的“根”视图控制器(我设置为 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;

我似乎必须做错事(第二次 hack 构建但会生成警告,因为我返回了一个指向错误类型的指针)。有人知道更好的方法吗? NavigationController 到底适合我吗,我只是误解了它的用途?我是否只需要实现一个自定义容器来充当我的 RootViewController 并管理这些其他 ViewController?

【问题讨论】:

    标签: objective-c cocoa-touch viewcontroller


    【解决方案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.
       }
    }
    

    【讨论】:

    • 嘿,我真的很喜欢这个。似乎编译器不喜欢这样: [self.view addSubview:mvc.view.frame] - 它应该是 [self.view addSubview:mvc.view] (没有'frame'调用结束)?
    • 对不起,我的错!复制粘贴的副作用 :) 你是对的,请看我编辑的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多