iOS——MVC
定义
模型-视图-控制器(MVC)设计模式为应用程序中的对象分配三种角色之一:模型、视图或控制器。该模式不仅定义了对象在应用程序中扮演的角色,还定义了对象彼此通信的方式。这三种类型的对象都通过抽象的边界与其他类型的对象分离,并跨越这些边界与其他类型的对象进行通信。应用程序中特定MVC类型的对象集合有时被称为层—例如,模型层。MVC是Cocoa应用程序良好设计的核心。
Model:当视图层中用于创建或修改数据的用户操作通过控制器对象进行通信,从而创建或更新模型对象。当模型对象发生更改时(例如,通过网络连接接收新数据),它会通知控制器对象,该对象会更新相应的视图对象。
View:查看对象通过应用程序的控制器对象了解模型数据的更改,并将用户启动的更改(例如,在文本字段中输入的文本 - 通过控制器对象 - 传递到应用程序的模型对象。
Controller:控制器对象解释在视图对象中进行的用户操作,并将新的或更改的数据传递给模型层。当模型对象发生更改时,控制器对象会将新模型数据传递给视图对象,以便它们可以显示它。
这是三者之间的关系图:
Model:负责业务逻辑、来自UI数据处理、本地数据、网络接收数据。 View:负责实现屏幕展示的UI、响应用户事件。 Controller:负责View与Model间的消息的转发传递。
MVC的用法
首先我们需要创建三个文件夹分别是:M、V、C。然后新建一个名为VView的类,继承自UIView,新建一个名为MModel的类,继承自NSObject。
实例
因为我们可以看出来M是用来处理数据的,我们就可以简单的声明两个方法。
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface MModel : NSObject
- (void)save;
- (void)load;
@end
NS_ASSUME_NONNULL_END
#import "MModel.h"
@implementation MModel
- (void)save {
NSLog(@"成功保存!");
[[NSNotificationCenter defaultCenter] postNotificationName:@"ok" object:self];
}
- (void)load {
NSLog(@"加载中...");
}
@end
在V中我们就需要创建显示在画面上的内容,比如按钮、文本框等等。
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface VView : UIView
@property (nonatomic , strong)UIButton *saveButton;
@property (nonatomic , strong)UIButton *loadButton;
- (void)viewInit;
@end
NS_ASSUME_NONNULL_END
- (void)viewInit {
_saveButton = [UIButton buttonWithType:UIButtonTypeCustom];
_saveButton.frame = CGRectMake(100, 100, 100, 100);
[_saveButton setTitle:@"保存" forState:UIControlStateNormal];
[_saveButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[self addSubview:_saveButton];
_loadButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_loadButton setFrame:CGRectMake(100, 250, 100, 100)];
[_loadButton setTitle:@"加载" forState:UIControlStateNormal];
[_loadButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[self addSubview:_loadButton];
}
当M和V已经创建好了,C相当于一个控制者,需要去分配数据首先我们需要实例化一个MModel和一个VView对象。
#import <UIKit/UIKit.h>
#import "VView.h"
#import "MModel.h"
@interface ViewController : UIViewController
@property (nonatomic, strong) VView *aView;
@property (nonatomic, strong) MModel *mModel;
@end
然后就可以对MModel以及VView的实例化对象进行分配数据了
#import "ViewController.h"
#define ScreenWidth [[UIScreen mainScreen]bounds].size.width
#define ScreenHeight [[UIScreen mainScreen]bounds].size.height
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(saveOK:)
name:@"ok" object:nil];
_aView = [[VView alloc]initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];
[_aView viewInit];
[_aView.saveButton addTarget:self action:@selector(saveBtnPressed:) forControlEvents:UIControlEventTouchUpInside];
[_aView.loadButton addTarget:self action:@selector(loadBtnPressed:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_aView];
_mModel = [[MModel alloc]init];
}
- (void)saveBtnPressed : (UIButton*)sender{
[_mModel save];
}
- (void)loadBtnPressed : (UIButton*)sender{
[_mModel load];
}
- (void)saveOK : (NSNotification*) notification{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"恭喜"
message:@"保存成功"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
NSLog(@"点击了取消按钮");
}];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
NSLog(@"点击了确定按钮");
}];
[alertController addAction:cancelAction];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
}
@end
结语
MVC的优点 : 1、可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。 2、视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。 3、模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。 4、潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。 MVC的不足之处 : 1、增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 2、视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。 3、视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。 4、目前,一般高级的界面工具或构造器不支持模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成MVC使用的困难。
|