如何在 iOS 中最好地使用 MVC

Posted

技术标签:

【中文标题】如何在 iOS 中最好地使用 MVC【英文标题】:How best to use MVC in iOS 【发布时间】:2011-10-31 03:53:06 【问题描述】:

我使用 MVC 工作了很长时间,但不确定我在 ios 中是否正确使用了这种模式。

这是我的理解和源代码,用于模型视图和控制器的划分。

说明:

    模型(例如 - MyModel 类) 模型这是我的数据。我使用模型进行定义计算,从 Internet 获取数据,并进一步通知控制器模型的变化,例如通过 NSNotificationCenter。

    控制器(例如 - MyController 类) 控制器可以直接联系其模型数据的请求,直接进入视图中的显示。

    视图(例如 - MyView 类) 查看 - 显示和收集来自用户的事件。 View 可以通过 target-action 和 delegate 与控制器交互。

代码:

类 MyModel:NSObject

    .h ... (some header code)
    .m
    Initialization method...

    // method for get data from internet
    -(NSData *)my_getDataFromInternet:(NSURL *)url
       NSData *data=[NSData dataWithContentsOfURL:url];
       return data;    
    

类 MyController:UIVIewController

     #import "MyView.h"
     .h
     MyView * my_view;

     #import "MyData.h"
     .m
     Initialization method...
     - (void)init
        my_view = [[MyView alloc]init];
        my_view.my_target = self;
        self.view = my_view;
     

     -(void)mycontrolleraction
        MyData * my_data = ...
        [my_data my_getDataFromInternet:some_url_image];
        my_view.my_image = [UIImage imageWithData:self.my_data];
     

类 MyView:UIView

     .h
     UIImage * my_image;
     property(nonatomic, assign)id my_target;
     .m
     Initialization method...
     - (void)initWithFrame
         UIButton * my_button = ...
         [button addTarget:my_target ....
         my_image = ...
         [self addSubview:my_image];
         [self addSubview:my_button];
      

我将目标添加到我的按钮 - my_target (my_target - 这是我的 MyController)。当用户点击我的按钮时 - 在 MyController 中执行方法并从我的 MyData 类中询问数据。

我想知道我在MVC中使用这个方法的错误在哪里。

【问题讨论】:

【参考方案1】:

看来您的想法是对的。我通常将模型视为存储数据并对其进行操作的东西,因此让模型获取图像然后直接返回而不存储它似乎有点奇怪。让模型保留数据可以避免以后再次获取数据,但是您拥有它的方式并没有错,数据的来源应该完全取决于模型。

我建议的与 MVC 无关的一件事是关注convention for initializers。您的初始化方法必须调用超类的指定初始化程序,因此您的控制器的 -init 应如下所示:

-(id)init

    if ((self = [super init]))     // double parens to avoid warning about = vs ==
        my_view = [[MyView alloc] init];  // assuming my_view is an ivar
        my_view my_target = self;
    
    return self;

视图和模型类也是如此。

【讨论】:

是的,我同意我在初始化时犯了一个错误。这是因为我在一个站点上输入了所有代码,而不是在 xcode 中输入并加快了一点。我得到了这个简单的交互示例,只是为了显示存在交互。它不是一个理想的代码 - 并且是 MVC 上除法的简单示例。感谢您的 cmets 和对我问题的回答。

以上是关于如何在 iOS 中最好地使用 MVC的主要内容,如果未能解决你的问题,请参考以下文章

在 MVC 模式的 GUI 应用程序中,可以、应该以及如何最好地将控制器与 GUI 布局隔离?

使用 ASP.NET MVC,如何最好地避免同时编写添加视图和编辑视图?

如何最好地为 Android MVC 应用程序实现一个内聚的模型层?

如何在 Android/iOS 上的 webview/移动浏览器中最好地预缓存视频?

如何使用 Socket.IO 最好地构建 Express V4.11+ 项目?

MVC模式:Massive View Controller?