iOS - 在单个屏幕上使用多个视图控制器

时间:2013-08-29 14:52:40

标签: ios objective-c xcode model-view-controller

在iOS中,如果屏幕包含许多功能,我很难保持视图控制器的代码清洁,因为为同一屏幕定义了许多方法。特别是对于(例如UITableViewUIAlertView等)的委托方法,或者如果同一个VC文件同时支持iPad和iPhone,它很快就会变成一团糟。

我也意识到如果你使用#ifdef语句,它就会破坏好的#pragma mark - Title分组。 问题1 - 你组织一个非常笨重的视图控制器的做法是什么?

问题2 - 类似地,对于具有多个部分组件的页面(例如,底部菜单,顶部菜单,侧面菜单等),您如何找到以下模式?

UIViewController *vc_component = ...
[self.view addSubview:vc_component.view];

对于我而言,MVC似乎是正确的,因为vc_component负责其视图的所有交互。困扰我的唯一事情就是有几个视图控制器同时负责同一个屏幕,这不是理想的IMO。

很想听听你的想法。

2 个答案:

答案 0 :(得分:1)

根据我的经验,如果一个视图控制器中包含大量代码,我会尝试将此代码放入另一个类中。例如,我的视图控制器包含处理某些控件以管理模型对象的面板。在这种情况下,我将创建ModelPanelControl视图并将其所有逻辑放在其实现中,然后将其作为我的View Controller的子视图。但是,如果您对View Controller进行了很多委托调用,那么只要您使用pragma标记拆分这些调用,我认为这没有任何问题。

要回答您的第二个问题,我认为您的项目是> = iOS5,因为您可以使用非常好的View Containment API将多个View控制器添加到一个屏幕。这是一个documentation,您还可以观看WWDC 2011视频,名为Implementing UIViewController Containment。

希望这能回答你的问题。 干杯!

答案 1 :(得分:1)

在回答您的第一个问题时,如果您确实有一个由一个容器viewController管理的viewControllers,为什么不让每个viewControllers成为其显式函数的delegate?因此,从该viewController触发UIAlertView或UIActionSheet的任何按钮操作等都是这些特定警报的委托?

您也可以很好地查看一些UIKit块类别。名叫Mugunth Kumar的绅士有一个叫UIAlertView + MKBlockAdditions,我发现它非常方便摆脱一堆代表意大利面。

通常的做法是定义一个基本的UIViewController,你的所有其他viewControllers都继承自那里,你实现了所有常见的帮助方法。将最小公分母放在那里,并将其余控制器设置为此类的子类。这至少有助于复制和粘贴问题,以及DRY范例。

最后,直到iOS5,将viewControllers封装在viewControllers中是很麻烦的,因为没有自动在所有子视图中调用旋转方法。工作流程如下:

[viewControllerContainer addChildViewController:anotherViewController];
[viewControllerContainer.view addSubview:anotherViewController.view];
[anotherViewController didMoveToParentController:viewControllerContainer];

教授掌管谁的操作系统。