如何在 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/移动浏览器中最好地预缓存视频?