【问题标题】:Model-View-Controller in iOSiOS 中的模型-视图-控制器
【发布时间】:2014-08-04 17:44:30
【问题描述】:

我了解模型-视图-控制器设计模式:模型、视图和控制器三个对象,其中视图完成所有绘图、接收用户交互并向控制器报告。但是,在 iOS 中,你有 UIViewController,它是一个控制器,视图作为一个对象,所有的绘图和处理都在同一个对象中完成,这不违反 MVC 模式吗?您不应该创建一个单独的 UIView 对象并将其链接到一个单独的控制器对象吗?

如果有人能帮我解决这个问题,那就太好了。谢谢!

【问题讨论】:

  • 我不完全确定你的意思,但是视图控制器的 .view 可以有子视图(所以它不必自己做所有的绘图)。注意 Apple 的 MVC 模式与标准 MVC 有点不同。
  • 并注意有一个单独的视图和控制器:UIViewController 有一个属性view 保存视图对象。
  • 感谢您的快速解答! UIViewController 有自己的view,但可以说,您必须在该视图上绘制一个按钮,这不会发生在UIViewController 对象本身中吗?而如果你有一个单独的UIView 对象,控制器可以调用[separateView showButton] 并让separateView 进行绘图?除非您打算创建一个新的UIView 对象并告诉UIViewControllerview 将该单独的视图添加为子视图,否则它应该是这样吗?
  • 是的,您应该执行[self.view addSubview:[[MyButtonView alloc] initWithTarget:self andSelector:@selector(...)]]; 之类的操作。如果这就是你的意思,我会写一个正确的答案。
  • 我想这就是我要找的,请你写一个正确的答案。

标签: ios model-view-controller


【解决方案1】:

视图可以有子视图,因此视图控制器可以将子视图添加到其主视图中,如下所示:

[self.view addSubview:[[MyNSViewSubclass alloc] initWith...]];

虽然您通常会使用 InterfaceBuilder 执行此操作。

因此,一个视图控制器负责其主视图 (.view)及其子视图

每个视图都实现了-drawRect: 方法,控制器不应该知道任何关于其视图的绘制。

在某些情况下,您还有多个视图控制器(想想 UINavigationController 的导航堆栈),每个控制器都有自己的主视图。

更新

这取决于。视图当然也可以[self addSubview:...];。如果您想以编程方式构建界面,我会从视图控制器中执行此操作。如果您设计了一个自定义视图并且您注意到它可以重用现有视图,您应该将这些现有视图作为子视图添加到您的自定义视图类中。添加和删​​除顶级视图(我的意思是视图控制器的.view 的直接子级)应该从视图控制器完成恕我直言。 (因为控制器负责获取它的视图来表示模型,所以即使它需要添加/删除子视图,它也应该这样做。)

这取决于。尽可能多地使用 Interface Builder,否则,让常识决定。

【讨论】:

  • 这实际上并不是我的意思。如果您有separateView=[MyNSViewSubclass alloc] initWith...],然后是[self.view addSubview:separateView],那么模型视图控制器中的“视图”现在是separateView,还是仍然是UIViewControllerview?而且,当我说“绘图”时,我的意思是创建并向视图添加一个按钮,这就是 MVC 中视图的工作,对吧?
  • 啊,我明白你的意思了。让我更新我的答案。 @user945711
  • 好的,谢谢。好像我误解了 MVC 模式,我认为视图应该自己创建按钮,按钮的标题由控制器设置,并将按钮按下事件报告给控制器。我不是 Interface Builder 的忠实粉丝,所以我通常编写所有视图组件。
  • @user945711 我认为学习使用Interface Builder会有很大的好处;它完全消除了这个问题。
  • 其实没问题,一切正常,我只是不明白为什么这不违反 MVC 模式。我更喜欢 Interface Builder 编码,因为它的灵活性,或者也许只是我。无论如何,感谢您为我解决这个问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2012-04-09
  • 2012-11-18
相关资源
最近更新 更多