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

MVC设计模式与delegate,tablview,Appdelegate,SceneDelegate

一、MVC

MVC就是Model(模型)、View(视图)、Controller(控制器)

例如上面的 excel表, 数据、数据结构就是模型Model

根据数据形成的直观的、用户能直接看见的柱形图是视图View

数据构成的表格就是控制器Controller,改变表格中的数据、属性等柱形图就会随之变化,控制了视图的变化,所以叫控制器。

View通过delegate向UIViewController报告事件的发生,如UIAlertDelegate。

二、Delegate

Delegate代理一开始接触是在我们使用UITableView时,我们使用了UITableViewDataSource协议与UITableViewDelegate协议,里面有一些代理方法,例如UITableViewDataSource中的一些代理方法:提供数据来源、用来处理数据源的变化

  

……

UITableViewDelegate中的代理方法:控制表格的选择、指定章节的头和尾的显示

……

那么什么是代理呢,代理其实类似于C++、Java中的类

当老师给了你全班的体重和身高,让你计算每位同学的体脂率,公式为:体重指数(BMI)=体重(kg)÷身高(m)²。最快的方法就是在Excel表中,输入公式,这样任务一下就完成了,不用自己一个一个算。

在你写的程序中,如果有大量重复的方法,它们只是名字不同,执行的操作是一样的,那么就可以使用代理。

让你写的每个方法“引用”代理中的方法。

C++

1.定义类

class student{
public:
String name;
void Printf(){cout<<"这是一个成员函数"<<endl;}
};

2.声明对象

student stu1;

3.对象调用成员函数

stu1.Printf();

1.首先定义一个协议,在协议中包含一个方法,要注意方法不要写{},不需要函数体,类似于JAVA中的接口,后面用的时候再实现

@objc protocol HeaderDelegate{
/*代理方法*/
func buttonClick(str:String)->String}

2.声明代理变量,同时设置一个按钮变量,点击按钮后执行ClickAction()方法

//一个代理
var delegate:HeaderDelegate?//一个按钮变量
private var button:UIButton?
//点击按钮后执行方法
button?.addTarget(self, action:#selector(ClickAction(_:)),forControlEvents:.TouchInside)

3.假设想让按钮被点击以后使用协议中的方法,那么

func ClickAction(sender:UIButton){
self.delegate?.buttonClick("我是协议中的方法")
}

4.代理对象

//添加一个view
let headView=TableHeadView(frame:HeaderRect)
//代理是自己
self.headerView.delegate=self

5.实现函数

func buttonClick(str:String)->String{
self.myTable.reloadData()
return("实现了代理中的方法")
}

tableView.dataSource=self

设置了UITableView的数据源为当前视图控制器对象

tableView.delegate=self

表格视图的代理对象为当前的视图控制器

那么代理有什么用呢?-举例

代理可以让两个视图关联起来,例如 

现有两个视图控制器AVC与BVC,你要通过B视图控制器同时修改A,B两个view的背景颜色

1.首先在BVC中定义一个协议 ,并实例化

protocol classBVCDelegate: AnyObject{func changeColor(_ color:UIColor)
}class BViewController:UIViewController{weak var delegate:classBVCDelegate?……}

2.AVC继承在BVC中定义的协议

class AViewController:UIViewController,classBVCDelegate{
……
}

3.在AVC中实现协议中的方法

func changeColor(_ color:UIColor){
self.backgroundColor = color
}

4.同时不要忘记在AVC指定代理对象:BVC的代理是继承、实现了代理协议而实例化的AVC

不要写在viewdidLoad中因为只有一开始视图还未呈现的时候加载一次这个模块,如果是通过导航栏返回上一层不会加载

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {if let nav = segue.destination as? UINavigationController, let classBVC = nav.topViewController as? BViewController {classBVC.delegate = self}}

代理的作用-总结

  • 无需继承便可改变对象的行为和外观。
  • 使任务可以交付给任意对象。(译者注:即抽象,无需依赖于具体类型)

 注!!!!!感谢大佬的文章以及github项目:大佬文章​​​​​​​

AppDelegate,SceneDelegate

  IOS13之后新增了SceneDelegate

1.AppDelegate

13之前,window在AppDelegate中 

window就是程序,一个程序只有一个UIWindow,IOS项目启动后会先创建一个window,再在之上有视图控制器,所以Navigition 的根视图控制器设置方法是

let nav = UINavigationController(rootViewController: ViewController())window = UIWindow(frame: UIScreen.main.bounds)window?.rootViewController = nav//这一句window?.makeKeyAndVisible()

AppDelegate中包含四个方法

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {return true
//launch:启动,所以这个方法在启动之后自动调用}func applicationWillResignActive(_ application: UIApplication) {//resign:放弃、辞退,该方法在程序不活跃,即将进入后台时执行}func applicationDidEnterBackground(_ application: UIApplication) {//如果支持后台运行,那么在后台运行时执行}func applicationWillEnterForeground(_ application: UIApplication) {//从后台切到前台}func applicationDidBecomeActive(_ application: UIApplication) {//程序已进入前台,处于活跃状态}func applicationWillTerminate(_ application: UIApplication) {//terminate:结束 程序将要退出,通常用于程序后台被清理前的一些数据保存}

由此可见,Appdelegate用于处理APP的整个生命周期,以及UI

2.SceneDelegate

13以后把对UI生命周期的管理放到了SceneDelegate中,一个应用可以有多个SceneDelegate实例,所以其实SceneDelegate的出现就是为了写多个scene,也就是为了能处理分屏的情况,但iPad可以,手机还不能分屏。

所以很多人在创建项目时会选择继续把UIWindow写入AppDelegate,把SceneDelegate删了

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 大数据-131 - Flink CEP 案例:检测交易活跃用户、超时未交付
  • Java 设计模式-状态模式
  • prometheus基于consul的服务发现
  • 了解MySQL 高可用架构:主从备份
  • 【H2O2|全栈】关于CSS(3)CSS基础(三)
  • 大屏自适应缩放解决方案
  • 跨平台集成:在 AI、微服务和 Azure 云之间实现无缝工作流
  • 如何在YoloV8中添加注意力机制(两种方式)
  • PyTest装饰器
  • 腾讯云、阿里云、华为云优惠券领取、查看、使用教程分享
  • C++ 中的 override 和 overload的区别
  • 旋转电连接器航空插头插座的特点
  • 《深度学习》OpenCV轮廓检测 模版匹配 解析及实现
  • QT信号槽原理是什么,如何去使用它?
  • [前端][JS]html中js不同位置的区别
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 08.Android之View事件问题
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • es6--symbol
  • flask接收请求并推入栈
  • github从入门到放弃(1)
  • Javascript 原型链
  • JavaWeb(学习笔记二)
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 多线程 start 和 run 方法到底有什么区别?
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​TypeScript都不会用,也敢说会前端?
  • # wps必须要登录激活才能使用吗?
  • #AngularJS#$sce.trustAsResourceUrl
  • #Linux(Source Insight安装及工程建立)
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .net反编译工具
  • .NET企业级应用架构设计系列之技术选型
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • /proc/stat文件详解(翻译)
  • @31省区市高考时间表来了,祝考试成功
  • @ComponentScan比较
  • @GlobalLock注解作用与原理解析
  • @Responsebody与@RequestBody
  • [000-01-011].第2节:持久层方案的对比
  • [autojs]autojs开关按钮的简单使用
  • [BeginCTF]真龙之力
  • [C#]C#学习笔记-CIL和动态程序集
  • [C#]winform基于opencvsharp结合Diffusion-Low-Light算法实现低光图像增强黑暗图片变亮变清晰
  • [C/C++]数据结构 栈和队列()
  • [Cloud Networking] Layer Protocol (continue)
  • [gdc19]《战神4》中的全局光照技术
  • [Geek Challenge 2023] web题解