文章目录

  • 什么是MVC?
  • MVC模式
    • 原理图解
    • 关于outlet
  • MVC样例(登陆/注册)
    • 关于 initWithFrame 方法
    • git

什么是MVC?

MVC最早存在于桌面程序中的, M(model)是指业务数据, V(view)是指用户界面, C(controller)则是控制器. 在具体的业务场景中, C作为M和V之间的连接.
负责获取输入的业务数据, 然后将处理后的数据输出到界面上做相应展示, 另外, 在数据有所更新时, C还需要及时提交相应更新到界面展示.
在上述过程中, 因为M和V之间是完全隔离的, 所以在业务场景切换时, 通常只需要替换相应的C, 复用已有的M和V便可快速搭建新的业务场景.
MVC因其复用性, 大大提高了开发效率, 现已被广泛应用在各端开发中。

MVC模式

MVC模式虽然是iOS编程中使用最广泛的模式,但论起复杂程度,MVC模式可以算是众多设计模式之首。通常情况下,MVC模式需要综合使用target-action模式delegate模式NotificationKVO模式等。

  • Model(模型)表示应用程序核心(比如数据库记录列表),通常模型对象负责在数据库中存取数据。模型独立于视图和控制器。
  • View(视图)显示数据(数据库记录),通常视图是依据模型数据创建的。
  • Controller(控制器)处理输入(写入数据库记录),通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

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

原理图解

  1. Controller和View之间可以通信,Controllor通过outlet(输出口)控制View,View可以通过target-actiondelegate或者dataSource(想想UITableVeiwDatasource)来和Controller通信;
  2. Controller在接收到View传过来的交互事件(View就是完成让人和程序的交互的呀,比如按B1按钮)之后,经过一些判断和处理,把需要Model处理的事件递交给Model处理(比如刚才的例子中的保存到数据库),Controller对Model使用的是API;
  3. Model在处理完数据之后,如果有需要,会通过Notification或者KVO的方式告知Controller,事件已经处理完,Controller再经过判断和处理之后,考虑下一步要怎么办(是默默无闻的在后台操作,还是需要更新View,这得看Controller的“脸色”行事)。这里的无线天线很有意思,Model只负责发送通知,具体谁接收这个通知并处理它,Model并不关心,这一点非常重要,是理解Notification模式的关键。
  4. Model和View之间不直接通信!

以上摘自此处

关于outlet

由于视图(view)和控制器(controller)的分离,为了解决视图和控制器交互的问题,iOS就引入了输出口(outlet)和操作(action)的概念。

outlet(输出口):控制器类可以通过一种特殊的属性来引用nib文件中的对象,这种属性称为输出口,可以把输出口看成是指向nib文件的对象的指针。假设你在界面上创建了一个文本标签,想要通过代码修改文本的内容。通过声明一个输出口,并将其指向此标签对象。你就可以在代码里通过输出口来修改标签。

MVC样例(登陆/注册)

  • 新建M、V、 C三个文件夹(需要几个View建几套文件夹)
  • M中新建一个名为LandingModel的类,继承自NSObject(以登陆界面为例)
  • V中新建一个名为LandingView的类,继承自UIView
  • C中新建一个名为LandingController的类,继承自UIViewController

先将登陆的V(view)的代码放出,登陆页面需要两个textfield文本输入框,和两个button(登陆/注册)按钮,具体的点击事件不需要在view文件夹写,这是controller中该做的事

@interface LandingView : UIView@property (nonatomic,strong) UITextField* userTextField;
@property (nonatomic,strong) UITextField* passwordTextField;
@property (nonatomic,strong) UIButton* landingButton;
@property (nonatomic,strong) UIButton* registerButton;@end
#import "LandingView.h"@implementation LandingView- (instancetype)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];self.backgroundColor = [UIColor whiteColor];_userTextField = [[UITextField alloc] initWithFrame:CGRectMake(100, 200, 175, 40)];_userTextField.backgroundColor = [UIColor yellowColor];_userTextField.placeholder = @"输入用户名";[self addSubview:_userTextField];_passwordTextField = [[UITextField alloc] initWithFrame:CGRectMake(100, 300, 175, 40)];_passwordTextField.placeholder = @"输入密码";_passwordTextField.backgroundColor = [UIColor yellowColor];[self addSubview:_passwordTextField];_landingButton= [UIButton buttonWithType:UIButtonTypeRoundedRect];[_landingButton setTitle:@"登陆" forState:UIControlStateNormal];[_landingButton setFrame:CGRectMake(120, 500, 75, 30)];[self addSubview:_landingButton];_registerButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];[_registerButton setTitle:@"注册" forState:UIControlStateNormal];[_registerButton setFrame:CGRectMake(225, 500, 75, 30)];[self addSubview:_registerButton];return self;
}
@end

关于 initWithFrame 方法

在上述代码初始化View中使用了initWithFrame方法。

initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸)。
当然,其他UI对象,也有initWithFrame方法,但是,我们以UIView为例,来搞清楚initWithFrame方法。

我们用编程方式申明,创建UIView对象时,使用initWithFrame方法。
在此,我们必须搞清楚,两种方式来进行初始化UIView

1. 使用 Interface Builder 方式。
这种方式,就是使用nib文件。通常我们说的“拖控件” 的方式。

实际编程中,我们如果用Interface Builder 方式创建了UIView对象。(也就是,用拖控件的方式)
那么,initWithFrame方法方法是不会被调用的。因为nib文件已经知道如何初始化该View。(因为,我们在拖该view的时候,就定义好了长、宽、背景等属性)。
这时候,会调用initWithCoder方法,我们可以用initWithCoder方法来重新定义我们在nib中已经设置的各项属性。

2. 使用编程方式。
就是我们声明一个UIView的子类,进行“手工”编写代码的方式。

实际编程中,我们使用编程方式下,来创建一个UIView或者创建UIView的子类。这时候,将调用initWithFrame方法,来实例化UIView
特别注意,如果在子类中重载initWithFrame方法,必须先调用父类的initWithFrame方法。在对自定义的UIView子类进行初始化操作。

以上摘自此处

关于M(model)模型文件中,完成对用户名、密码array数组的初始化方法函数。我在这个方法函数中增加了使用通知传值:每当初始化完毕后,此处新建的通知中心向controller控制器的接受函数中发送消息表示初始化已完成

#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface LandingModel : NSObject
@property (nonatomic, strong) NSMutableArray* userArray;
@property (nonatomic, strong) NSMutableArray* passwordArray;- (void)landingMassageInit;
@end
#import "LandingModel.h"@implementation LandingModel- (void)landingMassageInit {_userArray = [[NSMutableArray alloc] init];_passwordArray = [[NSMutableArray alloc] init];[_userArray addObject:@"11"];[_passwordArray addObject:@"11"];//添加 字典,将label的值通过key值设置传递NSDictionary *dict =[[NSDictionary alloc]initWithObjectsAndKeys:@"初始化完毕!",@"textOne", nil];//创建通知NSNotification *notification =[NSNotification notificationWithName:@"tongzhi" object:nil userInfo:dict];//通过通知中心发送通知[[NSNotificationCenter defaultCenter] postNotification:notification];
}

关于C(controller)控制器文件中,使用自定义的model、view类创建对应的对象——landingModellandingView,此时landingModellandingView成为输出口(outlet)并反馈在控制器中进行操作。还需要将view中的button控件的点击事件(target-action)在控制器文件中完成,将model中创建的用户名、密码array数组在控制器文件中访问并进行检验判断。

#import "ViewController.h"
#import "LandingView.h"
#import "LandingModel.h"
#import "RegisterController.h"NS_ASSUME_NONNULL_BEGIN@interface LandingController : ViewController <RegisterDelegate>
@property(nonatomic,strong) LandingView* landingView;
@property(nonatomic,strong) LandingModel* landingModel;- (void)passName:(NSString *)name passPassword:(NSString *)password;@end
#import "LandingController.h"@interface LandingController ()@end@implementation LandingController- (void)viewDidLoad {[super viewDidLoad];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tongzhi:)name:@"tongzhi" object:nil];_landingView = [[LandingView alloc] init];_landingView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);[_landingView.registerButton addTarget:self action:@selector(pressRegister) forControlEvents:UIControlEventTouchUpInside];[_landingView.landingButton addTarget:self action:@selector(pressLanding) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:_landingView];_landingModel = [[LandingModel alloc] init];[_landingModel landingMassageInit];
}- (void)pressRegister {RegisterController* registerViewController = [[RegisterController alloc]init];registerViewController.modalPresentationStyle = UIModalPresentationFullScreen;registerViewController.existUserArray = _landingModel.userArray;registerViewController.registerDelegate = self;[self presentViewController:registerViewController animated:YES completion:nil];
}- (void)pressLanding {BOOL flag = NO;for (int i = 0; i < _landingModel.passwordArray.count; i++) {if ([_landingView.userTextField.text isEqualToString:_landingModel.userArray[i]] && [_landingView.passwordTextField.text isEqualToString:_landingModel.passwordArray[i]]) {flag = YES;break;}}if (flag == YES) {UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"登陆成功!" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *sure = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:nil];[alert addAction:sure];[self presentViewController:alert animated:YES completion:nil];} else {UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"帐号或密码错误!" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *sure = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:nil];[alert addAction:sure];[self presentViewController:alert animated:YES completion:nil];}
}- (void)passName:(NSString *)name passPassword:(NSString *)password {[_landingModel.userArray addObject:name];[_landingModel.passwordArray addObject:password];
}- (void)tongzhi:(NSNotification *)text {NSLog(@"%@",text.userInfo[@"textOne"]);NSLog(@"-----接收到通知------");
}- (void)dealloc {[[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:self];
}

注册中的M、V、C三个文件夹同理,只是在注册的控制器中增加了协议传值将新注册的账号密码传入到登陆存储的数组中去,还有进行对登陆中用户名array数组的查重

效果如图:

git

附上git: 点击此处

【iOS】MVC设计模式相关推荐

  1. iOS——MVC设计模式

    什么是MVC MVC是Model-View-Controller的简写,它表示的是一种常见的客户端软件开发框架.可见他是由三个部分组成的. 下面解释一下这三个部分: Model:即为模型,用来存储业务 ...

  2. iOS MVC设计模式

    说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们经常碰到只需要某类一个实 ...

  3. iOS中MVC设计模式

    在组织大型项目的代码文件时,我们常用MVC的思想.MVC的概念讲起来非常简单,就和对象(object)一样.但是理解和应用起来却非常困难.今天我们就简单总结一下MVC设计理念. MVC(Model V ...

  4. 正确的理解iOS MVC

    MVC 刚接触iOS开发时,就知道Apple公司为我们提供了MVC模式,并且SDK设计也告诉我们应该搭配MVC使用.所以每一个人都应该掌握这种模式,那么,什么是MVC了? 被误解的MVC 根据MVC关 ...

  5. Flutter开发之MVC设计模式:新建文件与导入文件(八)

    在前面的例子中,所有的代码和路由都是在main.dart 下写的.我们知道不管后台还是前端,不管是Android 还是iOS开发,都是基于MVC设计模式开发的.那么flutter是怎么使用MVC设计模 ...

  6. MVC设计模式深入理解

    MVC要实现的目标是将软件用户界面和业务逻辑分离以使代码可扩展性.可复用性.可维护性.灵活性加强. MVC是三个单词的缩写:Model, View, Controller. View层是界面,Mode ...

  7. Xamarin简介与Xamarin支持MVC设计模式

    Create Native iOS, Android, Mac and Windows apps in C#. 官方网站:http://xamarin.com/ 使用武器 Run a C# app, ...

  8. mvc设计模式现在过时了吗_尚学堂115——设计模式、源码分析以及SpringData

    设计模式 什么是设计模式?你是否在你的代码里面使用过任何设计模式? 设计模式是在软件设计中常见问题的通用.可反复使用.多数人知晓的一种解决方案或模板:这些解决方案是在相当长的一段时间内由众多软件开发人 ...

  9. 第80节:Java中的MVC设计模式

    第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...

  10. IT兄弟连 JavaWeb教程 MVC设计模式

    MVC是Model-View-Controller的简称,即模型-视图-控制器.MVC是一种设计模式,它强制性地把应用程序的数据展示.数据处理和流程控制分开.MVC把应用程序分成3个核心模块:模型.视 ...

最新文章

  1. 安卓app和iosapp开发有什么不同呢?-综合外链_想让卫星软件不“软” 给草根开发者提供的条件得“硬”...
  2. DIY混合BCI刺激系统:SSVEP-P300 LED刺激
  3. mysql8中怎么增删一列_MYSQL 第八课 数据的增删改
  4. 《MySQL——count()逻辑》
  5. poj---Wormholes(虫洞)
  6. C++文件操作初体验
  7. H264压缩码率与GOP
  8. h5调用手机相机和录音机_html5 调用手机摄像头以及录音的方法
  9. excel数据正在计算机,excel数据太多表格太卡-急!Excel数据量大,电脑卡死?
  10. 时间换算(UTC是世界协调时,BJT是北京时间)
  11. 视频2-视频文件解析和格式说明
  12. GitHub 中国区前 100 名到底是什么样的人?
  13. 移动端网页的基础制作
  14. 构造和析构函数的调用
  15. ker矩阵是什么意思_第五课:初等矩阵及酉矩阵
  16. 高二会考计算机分数,高二会考多少分才能通过
  17. 获取视频中的特定帧,以及videoCapture 相关属性
  18. MySQL 8.0 OCP(1Z0-908)中文题库解析
  19. 《Spring揭秘》读书笔记 2:Spring AOP
  20. HMDB网站 爬取工具

热门文章

  1. 径向基网络(RBF network)之BP监督训练
  2. 推荐一个外国的数据结构在线演示网站
  3. git基本命令的理解
  4. 均值定理最大值最小值公式_求函数最值问题复杂难算,只要用对方法,考试得分不用愁...
  5. python怎么求商_如何用python求差商?
  6. SpringMVC框架 获取前台传过来的数组并解析
  7. ellipsize属性
  8. mui下拉刷新 ,无法滑动
  9. 【Mysql系列】游标/光标简介
  10. svn项目迁移后服务器up报错:E155036 的处理方法