MVVM 框架简介

2023-11-03

MVVM 在 iOS 中的应用

MVVM(Model View ViewModel)是基于 MVC(Model View Controller)和 MVP(Model View Presenter)发展起来的一种新的软件设计框架,并且其包含有 WPF 的特性。

WPF(Windows Presentation Foundation)是微软在 .NET Framework 3.0 开始推出的基于 Windows 的用户界面框架。

随着客户需求的日益繁杂,以及越来越重要的用户体验,都促使着视图设计工作与业务处理工作的分离。当两者分离后,视图的变化不再影响数据模型,而数据模型的变化也不影响视图,只要两者暴露出来的接口能够相互对应。在 ViewModel 中,根据两者对应的接口,将视图和数据相互绑定,以达到视图和数据的同步变化。

MVC

在 iOS 应用开发中,常用的框架设计模式为 MVC 模式(参见下图),控制器负责协调数据模型与视图之间的交互,除此之外,控制器还需要处理如场景转换、内存警告、键盘弹出等系统事件以及其他用户自定义的事件,所有的这些都放在控制器中,如 UITableview 的代理通常是控制器,而其中的 UITableviewCell 一般也设置控制器作为其代理,这些都造成了控制器中的代码臃肿,不利于程序的维护和扩展。
在这里插入图片描述

MVVM

MVVM 框架的关键在于将视图和数据模型之间的交互从其他事物剥离出来,单独作为一个模块。在 iOS 中,即将有关视图的变换从控制器中分离出来,这样,不仅避免了控制器代码量的过度膨胀,而且利于视图逻辑的修改。另外,可以预见的是,这种将视图与数据模型的绑定、变更操作统一到 ViewModel 中的设计方式,可以提高视图和数据模型的复用率。
在这里插入图片描述

MVVM 实例

这里给出一个 MVVM 架构设计的实例,目录结构如下图所示:
在这里插入图片描述
在这个例子中,自定义了一个 UIView 的子视图 PersonInfoView 用来保存并显示人员信息,与该视图相关的操作都封装在了 ViewModel 类中,其中包含数据的保存和读取。而这种方式,给控制器 ViewController 带来的影响是非常明显的,如下,其代码十分精简。

#import "ViewController.h"
#import "ViewModel.h"

@interface ViewController ()

@property (strong, nonatomic) ViewModel *viewModel;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.viewModel = [[ViewModel alloc]init];
    [self.view addSubview:self.viewModel.personView];
}

@end

数据模型在 Model 文件夹下,自定义视图在 View 文件夹下,视图模型在 ViewModel 文件夹下,合理的项目结构有利于项目的理解和维护。

需要注意的是,这只是一个简单的例子,使用 MVVM 架构并不比 MVC 架构方便多少,在实际工程应用中,需要根据实际情况来选择合适的架构。

该例子的效果图如下,感兴趣的可以参考源码
在这里插入图片描述

参考:

http://blog.devtang.com/2015/11/02/mvc-and-mvvm/

http://blog.csdn.net/u013406800/article/details/53410766

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVM 框架简介 的相关文章

  • 如何让 iPhone 屏幕变暗

    我的 iPhone 屏幕上有一个刷新按钮 可以刷新当前视图中的表格 屏幕刷新得很漂亮 但是有没有办法让屏幕变暗 然后在表格刷新后再次变亮 您可以在要调暗的视图上放置一个带有黑色背景的非不透明视图 默认情况下 其 alpha 值为 0 因此是
  • 在 iPhone 上搜索 PDF

    经过两天尝试使用 Quartz 从 PDF 中读取注释后 我成功做到了并且发布我的代码 https stackoverflow com questions 4080373 get pdf hyperlinks on ios with qua
  • 带有 Retina-Tiles 的 MKTileOverlay

    我在 MKMapKit 中加载 512x512px 图块时遇到问题 服务器提供 512x512 jpeg 图块 我在 MKMapView 中找不到自定义视网膜图块的任何解决方案或示例实现 我做什么 当我将它们加载到 MKMapView 中时
  • TestFlight Beta 中的消息不可用

    I am seeing Unavailable message in TestFLight Beta App in iOS8 Please find the attached screenshot please tell me how to
  • 获取在 iOS UIFont 中追踪字符的路径

    假设我在 iOS 应用程序中使用了自定义字体 Foo 我已将其添加到我的项目 plist 等中 并且我能够渲染UILabels之类的就很好了 现在 如果我想找出可以 追踪 该字体中的字母 P 的点序列 我将如何获得该点序列 例如 假设我想使
  • Swift:Tableview 在导航栏下方滚动但在状态栏上方滚动?

    我使用以下技巧隐藏了导航栏的阴影 self navigationController navigationBar setBackgroundImage UIImage for default self navigationControlle
  • 使用 JSONKit 解析 JSON 文件

    我正在构建一个音叉应用程序 货叉应允许最多 12 个预设节距 此外 我希望允许用户选择一个主题 每个主题都会加载一组预设 不必使用所有预设 我的配置文件看起来像这样 theme A3 comment An octave below conc
  • 在 Swift 中的 For 循环中更改对象的属性

    我创建了一个名为 ShoppingList 的简单结构 struct ShoppingList var shoppingListId NSNumber var title String var groceryItems GroceryIte
  • 从字典创建 Swift 对象

    如何根据 Swift 字典中的查找值动态实例化类型 希望这对其他人有用 我们需要进行一些研究才能弄清楚这一点 目标是避免巨大的 if 或 switch 语句从值创建每个对象类型的反模式 class NamedItem CustomStrin
  • Bootstrap 响应式表格在 iOS 设备上无法垂直滚动

    这就是我所拥有的 div class table responsive table class table style background transparent table div 我正在使用以下 bootstrap css 文件 ht
  • SDK 和 iOS 部署目标。

    我使用最新的 SDK 4 1 构建项目并设置 iOS 部署目标 3 0 如果我使用4 0 sdk的某些方法 我可以在真正的iPhone 3 0上运行我的项目吗 您只能在 OS 3 设备上运行您的项目 如果有条件地编码围绕您想要使用的 OS
  • UIScrollView 与 UITabBarController 切断

    我有一个 UIScrollView 我将其放置在视图中 界面生成器文档 xib m h 但是 UIScrollView 的下半部分被剪切 并且由于我有一个 UITabBarController 而没有显示其下半部分 我在 appdelega
  • 使用未声明的类型“对象”

    这太奇怪了 通常我可以理解未声明的类 但这是声称 Object 类本身未声明 NSObject 可以工作 但我的项目设置方式我需要它是一个纯 Swift 对象 我的类标题如下所示 import UIKit import Foundation
  • Swift - 保存在 TableView 中选择的复选标记

    我对 Swift 相当陌生 并且在 TableView 多重选择方面遇到问题 我有多个选择 可以用复选标记进行检查 类似于待办事项列表 当我检查项目时 我希望能够返回 ListView 并保存我的选择 我假设将其保持在已保存状态的代码将位于
  • iOS 搜索栏不显示结果

    更新 这实际上有效 我的自定义单元格的样式尚未出现 因此单元格看起来是空白的 那我怎样才能得到searchResultsTableView使用我的自定义单元格 我在表格视图中实现了搜索栏 当我调试时搜索 过滤所有工作 但是当我在搜索栏中输入
  • Facebook 登录打开错误的应用程序

    我正在尝试使用 facebook 实现应用程序的登录 但每次我尝试登录时 它都建议打开错误的应用程序 我尝试了一些在这里找到的东西 但没有成功 在 Facebook 的开发者页面上我添加了一个后缀 我的 plist 如下 有谁知道发生了什么
  • 如何制作像 Facebook 应用程序一样的登录屏幕?

    如何制作像 Facebook 应用程序一样带有 电子邮件 和 密码 文本字段的登录屏幕 Facebook登入 http extdesenv com wp content uploads 2012 05 facebook login ios
  • 具有隐式授权的 OAuth 应用程序中的客户端模拟

    来自 OAuth 草案 隐式section https datatracker ietf org doc html draft ietf oauth v2 31 section 1 3 2 在隐式授权流程期间发出访问令牌时 授权服务器不对客
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 从应用程序内发送电子邮件中的图像和文本

    如何从我的应用程序内通过电子邮件发送图像和文本 表格数据形式 请大家帮忙并提出建议 谢谢 void sendMailWithImage UIImage image if MFMailComposeViewController canSend

随机推荐

  • CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.tsinghua.edu.cn/anaconda/pk

    我是在配置Anaconda环境的时候出现的问题 conda create n py39 python 3 9 一般是配置清华镜像源之后出现的问题 解决方案 C Users 用户名 目录下找到 condarc文件 建议直接复制以下内容替换文件
  • 边开火边移动

    作者 周思博 Joel Spolsky 译 Paul May 梅普华 原文链接 英文 我总会有时候什么事都做不了 我当然还是会去上班 不过却是到处闲逛 每10秒就收一次信 逛逛网站 甚至做些付信用卡帐单之类不用动脑的事 就是没法子进入状况回
  • SpringBoot 2.0 中 HikariCP 数据库连接池原理解析

    作为后台服务开发 在日常工作中我们天天都在跟数据库打交道 一直在进行各种CRUD操作 都会使用到数据库连接池 按照发展历程 业界知名的数据库连接池有以下几种 c3p0 DBCP Tomcat JDBC Connection Pool Dru
  • 分布式消息队列RocketMQ 快速入门

    分布式消息队列RocketMQ 一 RocketMQ概述 概述 1 MQ简介 MQ Message Queue 是一种提供消息队列服务的中间件 是一套提供了消息生产 存储 消费全过程API的软件系统 2 MQ用途 限流削峰 MQ可以将系统的
  • qt: 系统默认程序打开文件或者软件;

    Qt提供了QDesktopServices类 可以利用openUrl函数调用默认程序打开文件 源码参考 ifdef Q OS WIN32 m szHelpDoc QString file m szHelpDoc bool is open Q
  • 购物车中的Ajax技术应用

    精选30 云产品 助力企业轻松上云 gt gt gt 目录 1 前言 2 Ajax基本原理 3 JQuery发送HTTP请求的常用方式 3 1 get 请求实现异步加载 3 2 post 请求实现异步加载 3 3 ajax 请求实现异步加载
  • c语言输入一个五位数,判断是否为回文数

    输入一个五位数 判断是否为回文数 include
  • 【深入理解计算机系统】第一章重点汇总

    当前有如下程序 hello c include
  • 二叉树中的列表

    leetcode 二叉树中的列表 给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表 如果在二叉树中 存在一条一直向下的路径 且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值 那么请你返回 True 否则
  • 开源教育对话大模型 EduChat

    文章目录 一 前言 二 本地部署 三 使用示例 四 总结 CSDN 叶庭云 https yetingyun blog csdn net 一 前言 教育是一项对人类身心发展产生影响的社会实践活动 旨在从内在激发人们固有或潜在的素质 因此 我们
  • 杭电OJ 1005 Number Sequence

    Number Sequence 页面数据来自 this page from http acm hdu edu cn showproblem php pid 1005 Time Limit 2000 1000 MS Java Others M
  • 把数组排序成最小的数(js)

    思路 要使用字符串来处理 要找到一个排序规则 根据这个规则排成一个最小数 比如 数组 3 32 321 不能直接比较 应该比较332 323 gt 332 gt 323所以32 lt 3 将两个数字n m连成字符串 nm gt mn n
  • ISP基本框架简介

    一 前言 ISP image signal processor 即图像信号处理 是用来对前端图像传感器输出信号进行处理的单元 相机采集图像的流程大概可以理解为 镜头采集到光信号 然后由sensor经过光电转换将光信号转换为电信号 将Baye
  • 联想笔记本电脑u盘重装win10系统教学

    联想笔记本电脑u盘重装win10系统教学 如果你有一个闲置的u盘 那么建议你可以拿它来练手一下u盘重装系统 我们只需要将这个u盘制作成为启动盘 之后有需要重装系统都可以使用它 甚至朋友有需要重装系统 也可以使用它来快速的帮忙重装一个新系统
  • 云计算概念及发展历程

    云计算概念 云计算是一种按使用量付费的模式 这种模式提供可用的 便捷的 按需的网络访问 进入可配置的计算机资源共享池 资源包括网络 服务器 存储 应用软件和服务 这些资源能够被快速提供 只需投入很少的管理狗你工作 或与服务供应商进行很少的交
  • 独立按键控制led灯的亮灭

    独立按键控制一个led灯的亮灭 直接可以控制指定位的变化 include
  • 网上企业订货系统功能列表介绍

    网上企业订货系统功能列表介绍 企业APP订单管理软件 后台功能列表 后台支持手机版本 订货APP 管理订单的APP 后台登陆 输入账号密码登录企业订货管理软件系统 后台首页 显示近日 月 年订单统计 和收款欠款等统计 订单模块 新建订单 通
  • MES系统业务需求收集及整理

    项目小组成立后 我们简单的编制了一个项目立项考察计划表 任务名称 负责人 开始时间 完成时间 需求及功能收集整理 IT项目经理 2018年9月05日 2018年9月20日 厂商考察调研 IT项目总监 2018年9月20日 2018年10月3
  • Socket错误代码对应表(转)

    提示 在命令提示符下输入 net helpmsg 1xxxx就能够得到Windows系统提供的错误提示的详细解释 出现网络联机错误Socket error 11001 表示您的计算机无法连上服务器 请检查您的Proxy设定以及Proxy相关
  • MVVM 框架简介

    MVVM 在 iOS 中的应用 MVVM Model View ViewModel 是基于 MVC Model View Controller 和 MVP Model View Presenter 发展起来的一种新的软件设计框架 并且其包含