我是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吗?
答案 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.
}
}