【iOS】MVC模式

MVC模式

MVC模式

MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。

  • View:该层用于存放视图,该层中我们可以对页面及控件进行布局。
  • Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。
  • Controlller:该层充当一个CPU的功能,即该应用程序所有的工作都由Controller统一管调控,他负责处理View和Model的事件。

MVC模式降低了各个环节耦合性,优化了Controller中的代码量。

MVC模式中各个层级之间的关系图 :

在这个图中,我们可以看出,Model层和View层之间并不会进行直接通信,他们之间是依靠Controller进行通信的。
流程:

点击view,视图响应事件,而后通过代理传递事件到Controller,发起网络请求更新model,model处理完数据,代理或通知给Controller,改变视图样式,完成操作。

MVC模式demo

这里我写了一个登陆注册的demo来学习MVC模式的具体使用。

下面展示我登陆界面的代码:
LandModel:

objectivec 复制代码
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface LandModel : NSObject
@property (nonatomic, copy) NSMutableArray* arr1;
@property (nonatomic, copy) NSMutableArray* arr2;
-(void) InitArray;
@end

NS_ASSUME_NONNULL_END
objectivec 复制代码
#import "LandModel.h"

@implementation LandModel
-(void) InitArray
{
    _arr1 = [[NSMutableArray alloc] init];
    _arr2 = [[NSMutableArray alloc] init];
}
@end

LandView:

objectivec 复制代码
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface LandView : UIView
@property (nonatomic, retain) UITextField* textUser;
@property (nonatomic, retain) UITextField* textPassword;
@property (nonatomic, strong) UIButton* btn1;
@property (nonatomic, strong) UIButton* btn2;
-(void) InitButtonAndText;
@end

NS_ASSUME_NONNULL_END
objectivec 复制代码
#import "LandView.h"

@implementation LandView
- (void)InitButtonAndText
{
    self.textUser = [[UITextField alloc] initWithFrame:CGRectMake(50, 160, 300, 40)];
    self.textUser.borderStyle = UITextBorderStyleRoundedRect;    self.textUser.placeholder = @"请输入账号";
    [self addSubview:self.textUser];
    
    _textPassword = [[UITextField alloc] initWithFrame:CGRectMake(50, 230, 300, 40)];
    self.textPassword.borderStyle = UITextBorderStyleRoundedRect;
    self.textPassword.placeholder = @"请输入密码";
    [self addSubview:self.textPassword];
    
    _btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    _btn1.frame = CGRectMake(50, 350, 80, 50);
    [_btn1 setTitle:@"登陆" forState:UIControlStateNormal];
    _btn1.tintColor = [UIColor blackColor];
    [self addSubview:_btn1];
    
    _btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    _btn2.frame = CGRectMake(170, 350, 80, 50);
    [_btn2 setTitle:@"注册" forState:UIControlStateNormal];
    _btn2.tintColor = [UIColor blackColor];
    [self addSubview:_btn2];
}

@end

ViewController:

objectivec 复制代码
#import <UIKit/UIKit.h>
#import "LandModel.h"
#import "LandView.h"
#import "RegistViewController.h"

@interface ViewController : UIViewController<SendDelegate>
@property (nonatomic, strong) LandView* landview;
@property (nonatomic, strong) LandModel* landmodel;
@property (nonatomic, strong) RegistViewController* regist;
@property (nonatomic, retain) UIAlertController* alert;

@end
objectivec 复制代码
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _landview = [[LandView alloc] init];
    _landmodel = [[LandModel alloc] init];
    [self.view addSubview:_landview];
    
    [_landmodel InitArray];
    [_landview InitButtonAndText];
    
    [_landview.btn1 addTarget:self action:@selector(login) forControlEvents:UIControlEventTouchUpInside];
    [_landview.btn2 addTarget:self action:@selector(regist1) forControlEvents:UIControlEventTouchUpInside];
}

-(void) login
{
    for(int i = 0; i < _landmodel.arr1.count; i++) {
        if([_landview.textUser.text isEqualToString:_landmodel.arr1[i]]&& [_landview.textPassword.text isEqualToString:_landmodel.arr2[i]]) {
            self.alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"登陆成功" preferredStyle:UIAlertControllerStyleAlert];
                        UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

            }];
            [self.alert addAction:confirmAction];
            [self presentViewController:self.alert animated:YES completion:nil];
        } else {
            self.alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"用户名或密码错误" preferredStyle:UIAlertControllerStyleAlert];
                        UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                        }];
            [self.alert addAction:confirmAction];
            [self presentViewController:self.alert animated:YES completion:nil];
        }
    }
}

-(void) regist1
{
    if(!_regist) {
        _regist = [[RegistViewController alloc] init];
    }
    _regist.delegate = self;
    [self presentViewController:_regist animated:YES completion:nil];
}
- (void)send:(NSMutableArray *)arruser password:(NSMutableArray *)password {
    _landModel.arr1 = [NSMutableArray arrayWithArray:aarruser];
    _landModel.arr2 = [NSMutableArray arrayWithArray:password];
}


@end
相关推荐
2501_9159184115 分钟前
iOS 上架注意事项有哪些?Appuploader 的四个阶段自查清单
android·ios·小程序·https·uni-app·iphone·webview
黑化旺仔20 小时前
【OC】Runtime:类元数据、加载初始化与消息派发
开发语言·macos·ios·objective-c
songgeb21 小时前
iOS App支持设置RTL语言的实践
ios·swift·ui kit
软泡芙21 小时前
【iOS】swift启动屏显示黑屏
ios
用户69371750013841 天前
当你向领导申请 AI 编程工具预算时,如果领导追问“能提效多少,有量化数据吗”,你该怎么回答?
android·后端·ios
Layer1 天前
一些脱离 Mac 依赖的 Agent 操作 iPhone 实现
ios·ai编程·测试
用户69371750013841 天前
当我说 Claude 搭配 GLM-5.3-Flash 太好用了,同事却提醒我:你可能正在失去对代码的掌控
android·后端·ios
茶底世界之下1 天前
一键裁方会丢掉什么?用 Awaking 给园林照片做两种画幅
ios
Marco_Marco1351 天前
定位SDK接入实战:Android/iOS/鸿蒙三端怎么选、怎么接
android·ios·harmonyos
步行cgn1 天前
Spring MVC POST 请求乱码:原因与完整解决方案
java·spring·mvc