MVC - 视图是否知道控制器?

Max*_*Max 3 model-view-controller cocoa cocoa-touch ios

我正在重构我的应用程序,以确保它符合MVC.我想拆分控制器(扩展UIController的MyController)和视图(扩展UIView的HomeView)我在myController中设置视图

self.view = [[HomeView alloc] init];
Run Code Online (Sandbox Code Playgroud)

当我按下UIButton时,在视图中调用一个方法,在这个方法中我想从控制器调用一个方法.

在我看来

[zenModeBtn addTarget:self action:@selector(touchZenMode:) forControlEvents:UIControlEventTouchDown];
Run Code Online (Sandbox Code Playgroud)

...

- (void) touchZenMode:(id) sender {
   [myController playZenMode];
}
Run Code Online (Sandbox Code Playgroud)

但是在视图中引用控制器实际上是一种不好的做法不是吗?

编辑:

所以在我的UIViewController中我做了这个:

- (id) init {
    HomeView* myHomeView = [[HomeView alloc] init];
    [myHomeView.arcadeModeBtn addTarget:self action:@selector(touchArcadeMode) forControlEvents:UIControlEventTouchUpInside];
    self.view = myHomeView;
    return self;
}
Run Code Online (Sandbox Code Playgroud)

那是对的吗 ?

Mun*_*ndi 6

与您的控制器交谈的视图没有问题,如此处的一些答案所述.例如,文本字段可以通过定义的委托方法通知其控制器.

但是,您的设计仍然存在严重缺陷.您的视图绝对没有处理按钮本身的业务.你认为视图不应该知道它的控制器的直觉是正确的.

您的控制器应该知道按钮以及如何对其进行反应.这就是为什么控制器有按钮IBOutlet来告诉按钮例如改变其标题或启用状态.它有按钮处理程序来响应UI事件.控制器的工作就是处理这个逻辑.视图的工作是显示标题,灰显或将敲击事件发送回控制器.

您应该在视图中添加的唯一代码基本上是如何绘制自己.一切,不能由控制器来处理.