3

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

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

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

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

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

很想听听你的想法。

4

2 回答 2

1

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

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

通常的做法是定义一个基础 UIViewController,您的所有其他 viewController 都从该基础 UIViewController 继承,您可以在其中实现所有常见的辅助方法。将最小的公分母放在那里,并将其余的控制器设置为它的子类。这至少有助于解决复制和粘贴问题以及 DRY 范式。

最后,在 iOS5 之前,将 viewControllers 封装在 viewControllers 中是很麻烦的,因为旋转方法不会在所有子视图中自动调用。工作流程是这样的:

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

这教会了操作系统谁负责谁。

于 2013-08-29T16:59:48.033 回答
1

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

为了回答您的第二个问题,我假设您的项目 >= iOS5,因为有一个非常好的视图包含 API,您可以使用它来将多个视图控制器添加到一个屏幕。这是一个文档,您还可以观看 WWDC 2011 视频,名为实现 UIViewController Containment。

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

于 2013-08-29T15:48:11.653 回答