MVC - 视图是否可以继续引用其视图控制器并处理数据?

时间:2013-02-22 13:16:43

标签: ios objective-c cocoa-touch model-view-controller uiviewcontroller

使用Cocoa-Touch,但这是一个普遍的问题。

视图是否可以保持对其视图控制器的引用并处理数据?我最近遇到了一个代码库,通过应用程序执行此操作 - 例如,有一个表视图控制器,它的单元格具有对视图控制器的弱引用(因此没有保留周期)。单元格通过

显示新的视图控制器
[self.parentVC presentViewController.....];

并以类似方式驳回它。此外,它们还处理数据/网络操作的变化。

直到我看到这个,我习惯于为每个单元创建协议并通过它们与父视图控制器通信。使用直接引用视图控制器的方法摆脱了所有协议。

对我而言,这似乎非常糟糕,但不确定它是否常见。

3 个答案:

答案 0 :(得分:5)

即将到来的答案是关于 Apple处理模型视图控制器的方式,这与其他SDK(ex Qt)完全不同。

这绝对是不良做法。它可以归结为一个问题,如果您认为这是一个好主意,那么为什么Apple没有在UIView类中添加该引用?

如果你看一下Apple uses the model view controller的方式,模型很清楚:

enter image description here

视图与控制器通信以发出状态变化信号,控制器根据需要更新模型并相应地更新视图。您永远不会找到Apple的文档或示例,您的视图将更新堆栈控制器。

如果一个UIView子类开始持有对持有它的控制器的引用(即使它是一个弱引用),你要删除对其控制器的视图抽象(引用是另一种方式)因此,对那些使用相同代码的人强烈鼓励不良做法。

什么会阻止其他开发者这次在视图附加到“模型”上添加引用?

现在我不是说这会把你的代码变成意大利面条代码(你仍然可以用它制作一个不错的应用程序),我说这真的(真的!)不好的做法。

希望这很清楚。

答案 1 :(得分:0)

我认为可能两者都是:非常糟糕和普遍。

视图应该是通用的,他们不需要知道有关其控制器的任何细节。通信应限于委托(协议),数据源(协议)或目标行动。

答案 2 :(得分:0)

嗯,......这种情况并不少见,也不是很好的风格。我自己做了,几乎迷路了。如果需要,我尝试采用委托模式。这意味着,是的,我确实保留了对恰好是视图控制器的委托的引用。委托对象确实实现了一个协议,在该协议中我总结了我将要调用的所有视图控制器(委托)的方法。

在这种情况下,您的示例将通过调用方法通知视图控制器发生的事情,然后视图控制器将调用要调用的下一个视图控制器。

通过这样做,我实现了同样的目的,但有点坚持MVC模式,因此总是知道在哪里寻找什么样的功能 - 即使在一年左右。