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 管理多个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
Xcode6/Swift - 如何在多个视图控制器中实现 iAdBannerView?
如何在 Objective-C 中管理、跟踪或同步多个服务器的异步请求?