【问题标题】:iOS - Using several view controllers for a single screeniOS - 在一个屏幕上使用多个视图控制器
【发布时间】:2013-09-02 02:00:36
【问题描述】:

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

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

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

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

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

很想听听你的想法。

【问题讨论】:

  • 键入:pragma mark - 当您扫描方法名称时,它会在下拉菜单中的分组之间插入一条线
  • 谢谢@JustinAmberson,但正如我所说,我已经这样做了
  • 我现在不在办公桌前知道,#pragma mark - Delegate Methods 插入一行吗?如果您只输入#pragma mark -,它会插入一行。 #ifdef 的作用是什么?
  • @JustinAmberson 这是一个 C 预处理器标志,它可以帮助您定义/取消定义标志(或全局值)
  • 一段时间后回到我的问题,视图控制器包含(即 addChildViewController)是要走的路

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我去看看视频。我不知道那个“addChildViewController”方法
【解决方案2】:

在回答您的第一个问题时,如果您确实有多个由一个容器 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];

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

【讨论】:

  • 谢谢,我会看看'addChildViewController'
猜你喜欢
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
相关资源
最近更新 更多