2013-04-04 120 views
3

我目前正在重构我的应用程序以确保它符合MVC。 我想分裂控制器(myController的延伸UIController)和视图(HomeView其延伸的UIView)我设置使用MVC - 视图是否知道控制器?

self.view = [[HomeView alloc] init]; 

在myController的视图当我推送的UIButton,一种方法是所谓的视图,在这个方法中,我想从控制器调用一个方法。

在我看来

[zenModeBtn addTarget:self action:@selector(touchZenMode:) forControlEvents:UIControlEventTouchDown]; 

...

- (void) touchZenMode:(id) sender { 
    [myController playZenMode]; 
} 

但在视图中有到控制器的参考真的是一个不好的做法,是不是?

编辑:

所以在我的UIViewController我做了这一点:

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

是正确的?

回答

6

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

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

您的控制器应该知道按钮以及如何响应它被点击。这就是为什么控制器有按钮IBOutlet s来告诉按钮例如更改其标题或启用状态。它有按钮处理程序来响应UI事件。处理这种逻辑是控制者的工作。视图的工作是显示标题,灰显或将轻击事件发送回控制器。

你应该放入视图的唯一代码基本上是如何绘制自己。所有不能由控制器处理的

+0

谢谢,但按钮也必须绘制,所以我必须把它留在视图中吗? – Max 2013-04-04 02:41:35

+0

你能看看我编辑吗? – Max 2013-04-04 04:04:41

+0

没错。在控制器中创建并配置按钮。请记住,控制器控制视图。 - 但是你的编辑是错误的。在'init'中,你必须调用'[[super alloc] init]'创建'self'。 – Mundi 2013-04-04 07:00:02

0

该视图需要某种方式将事情传回给控制器,询问下一步该做什么等问题。因此,视图对控制器有所了解是完全正确的。

某些内置视图(如UITextField)定义了用于告知其代表正在进行的操作的协议,或要求它执行某些操作。您通常在您的控制器中实施该协议。这种方式对于控制器来说并不是很了解,只是足以进行交流。这使得你的观点更加通用和可重用。

你想避免的是你的视图直接链接到你的模型。控制器的作用是在视图和模型之间进行调解。您应该能够完全改变视图的实现方式而不触摸模型,反之亦然。

0

你可以把这个方法在协议中您的视图界面:

@protocol MyViewDelegateProtocol <NSObject> 
    -(void)myMethod; 
@end 
  • 你把NSObject的类型称为委托一个新的属性在您的观点。
  • 您使您的视图控制器符合该协议,并且当它在视图中指派委托属性为self时。
  • 你在你的视图控制器实现中实现myMethod。
  • 现在您只需在需要时从视图中调用[委托myMethod]。
3

MVC模式的基本思想,在可可触摸使用:

Cocoa version of MVC as a compound design pattern

如下所述:The Model-View-Controller Design Pattern

你想实现什么,是loose-的一种形式,甚至盲目也许,耦合。通过使用协议(对于委托机制),View只知道有一个对象采用特定的协议,它可以“通话”。

UITableView为例。它不需要知道有哪种类型的UIViewController可以帮助它收集数据,但只有存在采用UITableViewDatasourceDelegate和/或UITableViewDelegate的对象;该对象可以是任何类型。

在您的编辑中,您使用了目标动作机制,这是实现松耦合的另一种方式。您在运行时设置连接;你的视图不知道你的控制器。因此:正确,除了注释@Mundi提出的关于您的init实现不完整的情况

+0

非常好的解释谢谢 – Max 2013-04-04 13:38:05