IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【iOS】—— MVC模式 -> 正文阅读

[移动开发]【iOS】—— MVC模式

MVC模式

首先我们来看MVC模式的概念是什么:
MVC(Model View Controller)模型(model)-视图(view)-控制器(controller)

  • Model:当视图层中用于创建或修改数据的用户操作通过控制器对象进行通信,从而创建或更新模型对象。当模型对象发生更改时(例如,通过网络连接接收新数据),它会通知控制器对象,该对象会更新相应的视图对象。
  • View:查看对象通过应用程序的控制器对象了解模型数据的更改,并将用户启动的更改(例如,在文本字段中输入的文本 - 通过控制器对象 - 传递到应用程序的模型对象。
  • Controller:控制器对象解释在视图对象中进行的用户操作,并将新的或更改的数据传递给模型层。当模型对象发生更改时,控制器对象会将新模型数据传递给视图对象,以便它们可以显示它。

MVC模式能够完成各司其职的任务模式,由于降低了各个环节的耦合性,大大优化Controller的代码量,当程序调试时,如果某一个功能没有按照既定的模式工作,可以很方便的定位到到底是Controller还是View还是Model出了问题,而且还利于程序的可复用性,建议在程序中能多多使用这个模式。

简单来说,之前我们总把各种控件和控件所要展示的数据编写在同一个文件即视图控制器文件,而MVC模式,是把这三种元素分开在不同的文件,最后整合在视图控制器文件显示出来。

三部分之间相互工作的原理图:
请添加图片描述

在这个图里面可以清楚的看出来,View部分和Model部分是不直接接触的,这个在一会会讲到,两部分在视图控制器里整合起来,然后展示在界面上。

iOS的MVC各层职责

controller层:
1、生成view,然后组装view
2、响应View的事件和作为view的代理
3、调用model的数据获取接口,拿到返回数据,处理加工,渲染到view显示
4、处理view的生命周期
5、处理界面之间的跳转

model层:
1、业务逻辑封装
2、提供数据接口给controller使用
3、数据持久化存储和读取
4、作为数据模型存储数据

view层:
1、界面元素搭建,动画效果,数据展示,
2、接受用户操作并反馈视觉效果

MVC该如何实现呢?

我们先来看一下我写的MVCdemo文件是如何分的?
请添加图片描述

这个MVC模式的小demo就是考核时登录注册的功能,按照MVC模式来写,文件就需要如上图这样的效果。

然后我们来看M,V,C三个部分代码:

LandModel.m

//  LandModel.m
//  MVC模式
//
//  Created by 翟旭博 on 2022/9/5.
//

#import "LandModel.h"

@implementation LandModel

- (void)ModelInit {
    self.zhanghaoArray = [[NSMutableArray alloc] init];
    [self.zhanghaoArray addObject:@"1"];
    
    self.mimaArray = [[NSMutableArray alloc] init];
    [self.mimaArray addObject:@"1"];
}

@end

LandView.m

//
//  LandView.m
//  MVC模式
//
//  Created by 翟旭博 on 2022/9/5.
//

#import "LandView.h"

@implementation LandView

- (instancetype)initWithFrame:(CGRect)frame {
    
    self = [super initWithFrame:frame];
    self.backgroundColor = [UIColor whiteColor];
    
    self.zhanghaoTextField = [[UITextField alloc] initWithFrame:CGRectMake(100, 200, 200, 50)];
    self.zhanghaoTextField.placeholder = @"请输入用户名";
    [self addSubview:self.zhanghaoTextField];
    
    self.mimaTextField = [[UITextField alloc] initWithFrame:CGRectMake(100, 280, 200, 50)];
    self.mimaTextField.placeholder = @"请输入密码";
    self.mimaTextField.secureTextEntry = YES;
    [self addSubview:self.mimaTextField];
    
    self.landButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [self.landButton setTitle:@"登陆" forState:UIControlStateNormal];
    self.landButton.titleLabel.font = [UIFont systemFontOfSize:20];
    self.landButton.frame = CGRectMake(150, 400, 50, 30);
    [self addSubview:self.landButton];
    
    self.registerButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [self.registerButton setTitle:@"注册" forState:UIControlStateNormal];
    self.registerButton.titleLabel.font = [UIFont systemFontOfSize:20];
    self.registerButton.frame = CGRectMake(220, 400, 50, 30);
    [self addSubview:self.registerButton];
    
    return self;
}

LandViewController.m

//
//  LandViewController.m
//  MVC模式
//
//  Created by 翟旭博 on 2022/9/5.
//

#import "LandViewController.h"
@interface LandViewController ()

@end

@implementation LandViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.landView = [[LandView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:self.landView];
    
    self.landModel = [[LandModel alloc] init];
    [self.landModel ModelInit];
    
    [self.landView.landButton addTarget:self action:@selector(pressland) forControlEvents:UIControlEventTouchUpInside];
    [self.landView.registerButton addTarget:self action:@selector(pressregister) forControlEvents:UIControlEventTouchUpInside];
}


需要注意的是我们V部分重写了initwithframe方法:
特别注意,如果在子类中重载initWithFrame方法,必须先调用父类的initWithFrame方法。在对自定义的UIView子类进行初始化操作。

还有一点,我们在M部分定义了一个实例方法,在C部分进行调用,需要注意的是在M部分的.h文件里要进行声明,否则在C部分无法调用。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:27:25  更:2022-09-13 11:29:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:28:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码