iOS - 如何在一个屏幕上使用多个视图控制器

3
在iOS中,如果一个屏幕拥有很多功能,由于为同一屏幕定义了许多方法,我很难保持其视图控制器的代码整洁。特别是对于代理方法(例如UITableViewUIAlertView等)或者如果同一VC文件要支持iPad和iPhone两种设备,它很快就会变得混乱。
我还意识到,如果使用#ifdef语句,则会破坏美好的#pragma mark - Title分组。
问题1 - 当视图控制器变得非常臃肿时,您如何组织代码?
问题2 - 同样地,对于具有几个部分组件(例如底部菜单、顶部菜单、侧边菜单等)的页面,您如何找到以下模式?
UIViewController *vc_component = ...
[self.view addSubview:vc_component.view];

我认为从MVC的角度来看,这是正确的,因为vc_component负责其视图的所有交互。唯一困扰我的是在同一时间有几个视图控制器负责相同的屏幕,这不太理想。

很想听听您的想法。


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

1
作为对你的第一个问题的回应,如果你确实有多个由一个容器viewController管理的viewControllers,那么为什么不让每个viewController成为其显式函数的委托呢?因此,任何从该viewController触发UIAlertView或UIActionSheet的按钮操作等都将是特定警报的委托?您还可以考虑一些已经存在的块UIKit类别。一个名叫Mugunth Kumar的绅士有一个叫做UIAlertView+MKBlockAdditions的类别,我发现它非常方便,可以摆脱一堆代理调用的麻烦。 通常的做法是定义一个基础UIViewController,所有其他的viewControllers都从这里继承,在这里实现所有通用的辅助方法。把最低公共项放在那里,并将其余的控制器设置为这个子类。这至少有助于解决复制和粘贴问题,以及DRY范例。 最后,在iOS5之前,将视图控制器封装在视图控制器中是hacky的,因为旋转方法不会自动调用所有子视图中的方法。工作流程如下:
[viewControllerContainer addChildViewController:anotherViewController];
[viewControllerContainer.view addSubview:anotherViewController.view];
[anotherViewController didMoveToParentController:viewControllerContainer];

这教了操作系统谁掌管谁。


谢谢,我会研究一下 'addChildViewController'。 - Ege Akpinar

1
根据我的经验,如果一个视图控制器包含了大量的代码,我会尝试将这些代码移到另一个类中。例如,我的视图控制器包含了处理一些用于管理模型对象的控件的面板。在这种情况下,我会创建一个名为ModelPanelControl的视图,并将所有相关逻辑放在它的实现中,然后将其作为子视图添加到我的视图控制器中。但是,如果您需要大量委托调用到您的视图控制器,则我认为只要使用pragma marks分割这些调用,就没有什么问题。
回答您的第二个问题,我假设您的项目版本>= iOS5,因为有一个非常好的View Containment API可以用来将多个视图控制器添加到一个屏幕上。这里有一个文档,您还可以观看WWDC 2011视频,名为“Implementing UIViewController Containment”。
希望这回答了您的问题。 祝好!

谢谢,我会看一下这个视频。我之前不知道有这个“addChildViewController”方法。 - Ege Akpinar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接