当前位置: 首页 > news >正文

【iOS设计模式】深入理解MVC架构 - 重构你的第一个App

目录

一、MVC模式概述

二、创建Model层

1. 新建Person模型类

2. 实现Person类

三、重构ViewController

1. 修改ViewController.h

2. 重构ViewController.m

四、MVC组件详解

1. Model(Person类)

2. View(Storyboard中的UI元素)

3. Controller(ViewController)

五、MVC数据流分析

六、MVC最佳实践

七、扩展练习

八、常见问题解答

九、总结

相关推荐


一、MVC模式概述

MVC(Model-View-Controller)是Apple官方推荐的iOS应用架构模式,它将应用程序分为三个核心组件:

  1. Model(模型):负责数据和业务逻辑
  2. View(视图):负责用户界面展示
  3. Controller(控制器):作为中介协调Model和View

二、创建Model层

让我们为上篇教程的App创建一个简单的Model。

1. 新建Person模型类

  1. 右键点击项目导航器中的HelloUIKit文件夹
  2. 选择"New File…"
  3. 选择"Objective-C class",点击Next
  4. 类名输入Person,父类保持NSObject
  5. 点击Create

2. 实现Person类

修改Person.h文件:

#import <Foundation/Foundation.h>@interface Person : NSObject@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger tapCount;- (instancetype)initWithName:(NSString *)name;
- (NSString *)greetingMessage;@end

修改Person.m文件:

#import "Person.h"@implementation Person- (instancetype)initWithName:(NSString *)name {self = [super init];if (self) {_name = [name copy];_tapCount = 0;}return self;
}- (NSString *)greetingMessage {return [NSString stringWithFormat:@"%@被点击了%ld次", self.name, (long)self.tapCount];
}@end

三、重构ViewController

现在我们来重构ViewController,使其符合MVC架构。

1. 修改ViewController.h

#import <UIKit/UIKit.h>
#import "Person.h"@interface ViewController : UIViewController@property (nonatomic, strong) Person *user;  // Model
@property (weak, nonatomic) IBOutlet UILabel *helloLabel;  // View
- (IBAction)buttonTapped:(id)sender;  // Controller action@end

2. 重构ViewController.m

#import "ViewController.h"@interface ViewController ()
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 初始化Modelself.user = [[Person alloc] initWithName:@"iOS开发者"];// 初始化UI状态[self updateUI];
}- (void)updateUI {// 根据Model更新Viewself.helloLabel.text = [self.user greetingMessage];
}- (IBAction)buttonTapped:(id)sender {// 更新Modelself.user.tapCount++;// 根据新Model状态更新View[self updateUI];// 更新按钮状态[sender setTitle:@"再点一次" forState:UIControlStateNormal];// 改变背景色CGFloat hue = (arc4random() % 256 / 256.0);self.view.backgroundColor = [UIColor colorWithHue:hue saturation:0.7 brightness:1.0 alpha:1.0];
}@end

四、MVC组件详解

1. Model(Person类)

  • 包含应用数据和业务逻辑
  • 完全独立于UI
  • 提供数据访问和操作方法
  • 示例中greetingMessage方法封装了消息生成逻辑

2. View(Storyboard中的UI元素)

  • 负责展示数据和接收用户输入
  • 不直接与Model交互
  • 通过IBOutlet暴露给Controller
  • 保持被动,由Controller更新

3. Controller(ViewController)

  • 协调Model和View之间的数据流
  • 职责包括:
    • 初始化Model和View (viewDidLoad)
    • 响应View事件 (buttonTapped:)
    • 更新Model (self.user.tapCount++)
    • 根据Model更新View (updateUI方法)
    • 管理View生命周期

五、MVC数据流分析

  1. 用户点击按钮:View触发buttonTapped:事件
  2. Controller处理
    • 更新Model (tapCount++)
    • 调用updateUI方法
  3. 更新View
    • Controller从Model获取数据
    • Controller更新Label显示

这样实现了单向数据流,各组件职责明确。

六、MVC最佳实践

  1. 保持Model独立

    • Model不应导入UIKit
    • 只包含数据和业务逻辑
  2. 保持View被动

    • View不应直接访问Model
    • 通过Controller更新状态
  3. 避免Massive View Controller

    • 将复杂业务逻辑抽离到Model或独立类
    • 使用updateUI方法集中管理界面更新

七、扩展练习

为了更好理解MVC,尝试以下扩展:

  1. 为Person类添加更多属性(如年龄、职业)
  2. 修改greetingMessage方法返回更丰富的信息
  3. 添加重置按钮,将tapCount归零
  4. 创建SettingsViewController来修改Person的name属性

八、常见问题解答

Q:为什么Model不能直接更新View?
A:这会破坏MVC的分离原则,导致代码难以维护和测试。

Q:所有UI更新都要放在updateUI方法中吗?
A:最佳实践是集中管理UI更新,但对于复杂界面可以按功能拆分多个更新方法。

Q:小型项目也需要严格MVC吗?
A:即使是小型项目,遵守MVC也能提高代码可维护性,建议从一开始就养成好习惯。

九、总结

通过本次重构,你学会了:

  1. 如何创建独立的Model层
  2. 严格分离Model、View和Controller
  3. Controller作为协调者的正确职责
  4. 实现单向数据流
  5. MVC各组件之间的通信方式

MVC是iOS开发的基石,掌握它将为你后续学习更复杂的架构(如MVVM、VIPER)打下坚实基础。

相关推荐

Objective-C UI事件处理全解析-CSDN博客文章浏览阅读1.7k次,点赞68次,收藏56次。本文全面解析iOS应用开发中的UI事件处理机制,涵盖响应者链、触摸事件和手势识别三大核心内容。首先详细介绍了响应者链的工作原理及其构成,包括UIResponder的关键方法。其次讲解了触摸事件处理的基础实现和多点触控技术,并演示了拖拽功能的实现。最后深入解析了UIGestureRecognizer的使用方法,包括系统提供的手势识别器、状态管理以及捏合缩放等高级功能的实现。文章还提供了UIControl事件机制、自定义事件传递等高级技巧,并给出性能优化建议和实用调试方法。 https://shuaici.blog.csdn.net/article/details/148784934让界面活起来:Objective-C中的UI动画实现-CSDN博客文章浏览阅读714次,点赞24次,收藏31次。这篇教程详细介绍了iOS开发中Objective-C实现UI动画的方法。主要内容包括:1.UIView基础动画实现,展示透明度、位置等属性变化的简单API;2.CoreAnimation的核心技术,讲解CALayer属性操作和关键帧动画;3.转场动画和iOS7引入的弹簧动画效果;4.动画性能优化技巧和调试方法;5.综合动画示例和常用代码片段。教程从基础到进阶,全面覆盖iOS动画开发技术,强调在实际应用中应保持动画简洁性、一致性和性能优化,为开发者提供了完整的动画实现解决方案。 https://shuaici.blog.csdn.net/article/details/148784474

http://www.lryc.cn/news/581964.html

相关文章:

  • iOS Widget 开发-1:什么是 iOS Widget?开发前的基本认知
  • 动手学深度学习13.6. 目标检测数据集-笔记练习(PyTorch)
  • DSP学习笔记2
  • 轨迹优化 | 基于激光雷达的欧氏距离场ESDF地图构建(附ROS C++仿真)
  • 7月份最新代发考试战报:思科CCNP 华为HCIP HCSP 售前售后考试成绩单
  • 网络安全之XSS漏洞:原理、危害与防御实践
  • 南柯电子|显示屏EMC整改:工业屏与消费屏的差异化策略
  • 接口漏洞怎么抓?Fiddler 中文版 + Postman + Wireshark 实战指南
  • 告别Root风险:四步构建安全高效的服务器管理体系
  • AJAX vs axios vs fetch
  • 【算法笔记】5.LeetCode-Hot100-矩阵专项
  • 腾讯云录音文件快速识别实战教程
  • Java后端技术博客汇总文档
  • 无人机声学探测模块技术分析!
  • 【C++开源库使用】使用libcurl开源库发送url请求(http请求)去下载用户头像文件(附完整源码)
  • RESTful API概念和设计原则
  • Ubunt20.04搭建GitLab服务器,并借助cpolar实现公网访问
  • 01、通过内网穿透工具把家中闲置电脑变成在线服务器
  • Java 大视界 -- 基于 Java 的大数据可视化在企业供应链动态监控与优化中的应用(336)
  • 迅为RK3568开发板基本工程目录-OpenHarmony APP工程结构
  • 上传Vue3+vite+Ts组件到npm官方库保姆级教程
  • 基于ArcGIS的洪水灾害普查、风险评估及淹没制图技术研究​
  • 【LeetCode 热题 100】206. 反转链表——(解法二)指针翻转
  • UE5详细保姆教程(第四章)
  • Post-Training on PAI (2):Ray on PAI,云上一键提交强化学习
  • 暑假算法日记第三天
  • C++笔记之开关控制的仿真与实际数据处理优雅设计
  • GNN--知识图谱(逐步贯通基础到项目实践)
  • 数学建模从入门到国奖——备赛规划优秀论文学习方法
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(四十一) -> 获取自定义编译参数