news 2026/5/11 23:24:39

iOS——MVC架构学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
iOS——MVC架构学习

MVC架构初步学习

  • MVC架构的概念
    • 三个部分
    • 使用MVC架构的好处
  • 三部分的内容
    • Model层
    • Controller
    • View层
  • Model该怎么设计
  • MVC传递的流程
  • 举例
    • tableView
      • Model设计
      • Controller和View设计
  • 总结

MVC架构的概念

三个部分

MVC 是一种解耦代码的设计,把一个功能拆成三块来写,分别是:

  • Model(模型层):数据内容是什么
  • View(视图层):数据怎么显示给用户看(UI怎么画)
  • Controller(控制器层):负责在两者之间传值,处理交互逻辑,比如点击,滑动

三个首字母合起来就是 Model-View-Controller,缩写 MVC。

使用MVC架构的好处

初学写 OC 的时候,我们经常把所有逻辑全堆在 ViewController 里。数据初始化,画UI,处理交互逻辑全写在一起,代码一长就没办法看,导致改不到想改的地方反而弄出bug

MVC 的思路是:职责分离。每一块只管自己该管的事:

  • Model 只负责数据,不关心怎么显示
  • View 只负责展示,不关心数据从哪来
  • Controller 负责拼接起来两边

这样的好处是:

  1. 改数据结构只针对 Model,改UI布局只动 View
  2. 复用方便,同一个 Model 可以配不同的 View,省去很多不必要的代码

三部分的内容

Model层

Model 就是数据的载体。比如要展示一篇文章,Model 里面就放着标题、内容、发布时间这些文章数据

Model 本身不做 UI,不直接操作视图,它只负责把数据存好、整理好,让其他两个部分取用

// 上面举例的文章的 Model@interfaceArticle:NSObject@property(nonatomic,copy)NSString*title;@property(nonatomic,copy)NSString*content;@property(nonatomic,copy)NSString*date;@end

注意Model一般只关注.h文件,当成一个数据结构用即可

Controller

Controller 由于需要拼接Model和View,它负责:

  • 从 Model 取数据
  • 把数据交给 View 去显示
  • 接收 View 上交互动作,再去更新 Model 或者刷新 View

在 iOS 开发里,ViewController 就是天然的 Controller

View层

View 就是用户看到的那层界面,UILabel、UIButton、UITableViewCell 这些都是 View界面展示的东西

View 不处理业务逻辑,只负责把 Controller 交给它的数据"渲染"出来,所以它只接收Controller传递来的Model即可

View 可以把用户的操作(比如点击、滑动)通过代理或者回调告诉 Controller,但它本身不决定点了之后做什么,诸如此类属于交互逻辑,本就应该交给Controller来处理

Model该怎么设计

Model 的设计原则很简单:数据是什么样子,Model 就设计成什么样子,比如cell展示标题,头像,就写标题和头像的title进去

@interfaceUserModel:NSObject@property(nonatomic,copy)NSString*Name;@property(nonatomic,copy)NSString*avarPicture;@end

MVC传递的流程

整体的流程可以这么理解:

拆开来说就是:

  1. 用户在 View 上做了操作(比如点了个按钮)
  2. View 通过反向传值 把事件告诉 Controller
  3. Controller 根据事件去操作 Model
  4. Model 数据变化之后,Controller 拿到新数据
  5. Controller 把新数据设置给 View,View 刷新显示

注意 Model 和 View 之间是没有直接联系的,都要经过 Controller 与他们交互

举例

tableView

用一个常见场景来说明:展示一个用户列表,每行显示头像、名字、简介。

Model设计

每一行对应一个用户,Model 就按用户信息来设计:

// UserModel.h@interfaceUserModel:NSObject@property(nonatomic,copy)NSString*name;//名字@property(nonatomic,copy)NSString*bio;//简介@property(nonatomic,copy)NSString*avatarUrl;//头像@end

Controller和View设计

Cell 就是 View 层,它只负责把数据显示出来,不管数据从哪来:

// UserCell.h@interfaceUserCell:UITableViewCell-(void)configureWithModel:(UserModel*)model;// 接收 Model@end// UserCell.m-(void)configureWithModel:(UserModel*)model{self.nameLabel.text=model.name;self.bioLabel.text=model.bio;}

Controller 负责持有Model、搭建 tableView:

// UserListViewController.m@interfaceUserListViewController()<UITableViewDataSource>@property(nonatomic,strong)UITableView*tableView;@property(nonatomic,strong)NSMutableArray<UserModel*>*users;// Model 数组@end@implementationUserListViewController-(void)viewDidLoad{[superviewDidLoad];[selfloadData];[selfsetupTableView];}-(void)loadData{NSArray*data=@[@[@"小李",@"18岁",@"image1"],@[@"小芳",@"不爱吃水果",@"image2"]]for(inti=0;i<data.count;i++){UserModel*model=[[UserModel alloc]init];model.name=data[i][0];model.bio=data[i][1];model.avatarUrl=data[i][2];[self.users addObject:model];}}-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{returnself.users.count;}-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{UserCell*cell=[tableView dequeueReusableCellWithIdentifier:@"UserCell"forIndexPath:indexPath];UserModel*model=self.users[indexPath.row];// Controller 从 Model 数组取数据[cell configureWithModel:model];// 交给 View 去显示returncell;}@end

这样三层的职责就很清晰:

  • UserModel:只管数据长什么样
  • UserCell:只管一行怎么显示
  • UserListViewController:负责把数据填进 Cell,管理整个列表的逻辑

总结

MVC 的核心就一句话:让每部分只做自己该做的事。

职责不该做的事
Model存数据、整理数据操作 UI、直接更新视图
View显示数据、传递用户操作处理交互逻辑、直接改数据
Controller负责把数据填进 Cell,管理整个列表的逻辑修改View的UI界面
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 23:22:53

别再只用XGBoost了!LightGBM实战:从Kaggle到工业界的效率提升秘籍

LightGBM实战&#xff1a;从Kaggle到工业界的效率革命 在机器学习竞赛和工业界应用中&#xff0c;XGBoost长期占据着主导地位。但当你面对千万级数据、高维特征时&#xff0c;是否常被漫长的训练时间和内存瓶颈困扰&#xff1f;三年前我在一个电商点击率预测项目中&#xff0c;…

作者头像 李华
网站建设 2026/5/11 23:19:00

时间序列预测:用Prophet和LSTM预测股价

在软件测试领域&#xff0c;我们习惯于验证功能、压测性能、追踪缺陷&#xff0c;但面对越来越多的数据驱动型应用&#xff0c;测试的边界正在向模型和数据管道延伸。时间序列预测&#xff0c;尤其是像Prophet和LSTM这样用于股价预测的复杂模型&#xff0c;不再是数据科学家独享…

作者头像 李华