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

Posted

技术标签:

【中文标题】Objective-C 管理多个视图控制器【英文标题】:Objective-C Manage Several View Controllers 【发布时间】: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?

【问题讨论】:

【参考方案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'调用结束)? 对不起,我的错!复制粘贴的副作用 :) 你是对的,请看我编辑的答案。

以上是关于Objective-C 管理多个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

子视图的objective-c管理顺序

Objective-C - 理解视图控制器

Xcode6/Swift - 如何在多个视图控制器中实现 iAdBannerView?

如何在 Objective-C 中管理、跟踪或同步多个服务器的异步请求?

如何使用objective-c在xcode中使用共享偏好? [复制]

Objective-C 在子视图数组中跟踪我的视图