为啥使用 ViewController 来管理 ViewController 而不仅仅是 ApplicationDelegate

Posted

技术标签:

【中文标题】为啥使用 ViewController 来管理 ViewController 而不仅仅是 ApplicationDelegate【英文标题】:Why use a ViewController to manage ViewControllers and not just the ApplicationDelegate为什么使用 ViewController 来管理 ViewController 而不仅仅是 ApplicationDelegate 【发布时间】:2011-06-22 14:06:04 【问题描述】:

如果我有一堆只处理单个视图的 ViewController,或者即使我的 ViewController 将处理多个视图,我为什么要使用另一个 ViewController 来管理其他 ViewController?为什么不直接在 ApplicationDelegate 级别更改 ViewControllers?

也许我以错误的方式考虑 ViewController?我习惯于使用 Ruby/.NET 编写 MVC 模式。例如,如果我使用小部件,我可能会有一个 WidgetController 和一个 List 视图,以及 WidgetController 的 Detail 视图。

什么是类似的 iPhone MVC 构造?我假设 WidgetController 将继承 ViewController 并且根据我想查看小部件数据的方式,我会有几个不同的视图。然后,当我想处理 Wodgits 时,我会创建一个带有关联视图的 WodgitController,并用新的 Wodgit ViewController 交换窗口的子视图。

我看不出有一个 RootViewController 来控制我的控制器能给我带来什么。价值在哪里?我错过了什么?

【问题讨论】:

【参考方案1】:

我将专注于一个方面:划分是一个非常有用的设计原则。如果你将关注点分开并将它们放在它们“所属”的地方,它们将更容易找到、维护和构建,并为新的目的而选择。

考虑一下:

你家的所有管道都通向同一个地方。您是在水槽里小便,还是使用专为此目的设计的固定装置?

就您的应用而言,应用委托负责响应应用事件并管理通用应用资源。根视图控制器负责管理您的视图和视图控制器。作为视图控制器,它具有导航控制、呈现模态视图、充当委托等方面的特殊能力。虽然您可以创建视图控制器并在应用程序委托中完全操纵它,但任务将成倍增长当您管理的视图数量成倍增加时,难度会更大,特别是如果您希望成为文本字段委托、数据源等。另一方面,很容易将根视图控制器拆分为自己的类。成本很低。

距离马桶一步之遥,为什么要在水槽里小便?

【讨论】:

UIViewController 将视图行为与应用程序行为区分开来,就像应用程序与操作系统的交互方式一样。我在上面列出了视图控制器可以做的一些特殊事情。我不使用 .net,但我使用 Ruby on Rails。与 rails 比较的问题在于,rails 中的 mvc 架构的目标是本质上是一次性状态更改和渲染操作(每个请求),而不是正在运行的应用程序。 我猜你可以认为路由、延迟作业和应用程序控制器类似于应用程序委托,视图控制器类似于动作控制器,而 xib 类似于 rails 中的 erb 或 haml 视图, 虽然路由可能也像视图控制器 IBActions。 我想我在试图将 web 的 MVC 映射到我脑海中的 iphone 的 MVC 时已经陷入了太多的困境。我觉得在 AppDelegate 中有一个获取控制器视图的窗口,当视图更改以显示不同的模型时,控制器也应该更改,但是窗口或应用程序的工作应该是更改控制器,而不是另一个控制器。我太拘泥于“控制器”这个词以及我认为它应该是什么而不是它是什么。我想我只需要处理。非常感谢! =) np。顺便说一句,我认为应用程序委托是一个控制器,而不是一个视图控制器。

以上是关于为啥使用 ViewController 来管理 ViewController 而不仅仅是 ApplicationDelegate的主要内容,如果未能解决你的问题,请参考以下文章

电脑为啥不能用键盘Ctrl+VCtrl+C复制粘贴了

为啥导入 ViewController 会导致 Xcode 无法找到另一个 ViewController?

为啥模拟器中没有出现导航栏?

为啥在操作系统中引入信号量及P、V操作?

为啥我的 ViewController 在第二次调用后才发布,iOS ARC?

为啥返回 ViewController 时 tableView Cell 会被选中?