【发布时间】:2015-10-18 03:30:20
【问题描述】:
许多视图都有子视图,它们不一定需要有自己的控制器与之关联。在 Apple 的 own tutorial 创建自定义视图中,他们实际上并没有为每个子视图创建一个子 UIViewController。
但是,我经常遇到这样的情况,即我会有一个视图层次结构,其中子视图的某些子视图有一个发送网络请求的按钮。在那种情况下,我可以做一个目标:
myView.addTarget(self, action: "networkRequest:", forControlEvents: UIControlEvents.TouchDown)
然后在同一个 myView 类中我可以处理该网络请求,但这似乎打破了 MVC 模式。视图不应该做逻辑,它们应该只显示东西,对吗?
另一个选项我们可以做的是让每个视图都可以访问其逻辑所需的父级或祖父级控制器。在这种情况下,我的目标可能类似于:
func networkRequest(view : MyView) {
self.controller.doNetworkRequest()
}
但这似乎也不是一个正确的解决方案。再一次,我们似乎只是在打破 MVC 并摆脱困境。
因此,据我所知,我们只剩下两个选项之一:
首先,我们可以从父控制器本身添加目标和所有逻辑。但是这样做会给我们带来像这样的讨厌的链条:
self.grandParentView.parentView.childView.addTarget(self, action: "networkRequest:", forControlEvents: UIControlEvents.TouchDown)
那长长的访问列表让我不寒而栗,而且看起来很糟糕。但是,它似乎仍然遵循 MVC。从技术上讲,我们正在控制器中执行逻辑,对吗?
但可能还有另一种选择。我们可以只给每个视图一个控制器,并让每个 UIViewController 为每个新的子视图都有一个子控制器。
但是,有些视图是静态的。它们实际上没有任何逻辑,因此它们不一定需要控制器。但是,如果我们要遵循这个约定,我们基本上每个视图都需要一个,否则我们会在控制器有孙控制器但没有子控制器的情况下出现不一致。
所以我们需要为我们的控制器创建很多空棺材。这会构建许多从未使用过的死代码,这可能会导致一些软件腐烂。
那么比我更聪明更聪明的人,这里的正确解决方案是什么?
【问题讨论】:
-
"在 iOS 中,每个 UIView 都应该有一个 UIViewController 吗?"不,但每个视图都应该是视图控制器的主视图,或者应该是此类视图的子视图(在一定深度)。
-
您仍然会遇到上述问题。你会得到冗长的层次结构链。
-
也许你会。我不。在任何时候都不必有超过 一个 视图控制器。你只是在想这整件事。
标签: ios uiview uiviewcontroller