MVC设计模式与delegate

news2024/12/27 16:25:28

一、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表中,输入公式,这样任务一下就完成了,不用自己一个一个算。

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

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

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项目:大佬文章​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ABAP JSON处理应用

1. json 转换成内表 通过上传URL获取json数据并转换为内表 json to itab关键字 METHOD get_itab_for_json.DATA : lr_client TYPE REF TO if_http_client,lv_url TYPE string,lv_content_type TYPE string VALUE application/x-www-form-urlencoded,ev_xstrin…

【python报错】ModuleNotFoundError: No module named ‘utils‘

问题 想要用python语言将A文件夹的a.py脚本引用utils文件夹b.py脚本&#xff0c;直接引用&#xff1a;from utils import XXX 导致在vscode编译器报错&#xff1a;ModuleNotFoundError: No module named utils 这里文件夹A和utils是同级目录【其他情况&#xff0c;修改后面代码…

背钻设计时要优先保证哪一项,STUB长度真的是越短越好吗

高速先生成员--王辉东 人道是&#xff1a; 八月十八潮&#xff0c;壮观天下无。 鲲鹏水击三千里&#xff0c;组练长驱十万夫。 红旗青盖互明末&#xff0c;黑沙白浪相吞屠。 人生会合古难必&#xff0c;此情此景那两得。 小蝶托着腮望着窗外&#xff0c;思绪飞到千里之外…

【鸿蒙开发从0到1 day08】

鸿蒙开发基础 一.联合类型二.枚举类型三.组件和样式1. ArkUI基本语法 四.尺寸五.字体1.字体颜色2.字体样式3.LineHeight() 设置行高 上间距文字下间距4.下划线:5.对齐方式(1)水平对齐方式(2)垂直对齐方式 6.文本缩进和文本省略号设置 六.图片1.图片的等比例缩放2.占位符3.图片填…

2024腾讯互联网AI应用专场

2024腾讯互联网AI应用专场 灵魂提问&#xff1a; 1、AI应用场景&#xff1a; 智能客服智能数据分析BI 通过AI生成的内容的点击率是人工生产的103%。 2、AI时代已经来临&#xff0c; 依然是这些互联网巨头领导。 现在股价低迷&#xff0c;是不是投资的好机会。 3、agent …

矩阵怪 - 2024全新矩阵产品,一键分发抖音,快手,视频号,B站,小红书!

1. 本方案面向谁&#xff0c;解决了什么问题 本方案主要面向C端客户&#xff0c;特别是那些在各大短视频平台&#xff08;如小红书、抖音、视频号、快手、B站等&#xff09;上进行内容创作和分发的个人用户、自由职业者、小型团队或企业。这些用户通常面临着在多个平台上同时发…

Python爬虫如何通过滑块验证

一&#xff1a;定位元素的坐标 当 Selenium 定位到元素后&#xff0c;如果想获取元素在页面中的具体坐标位置&#xff0c;可以通过 element.location 的方式来得到元素的起始坐标字典&#xff08;元素的左上顶点&#xff09;。然后再通过 element.size 的方式来获取该元素的宽…

Python列表浅拷贝的陷阱与破解之道

引言 在Python编程世界中&#xff0c;列表的拷贝操作看似简单&#xff0c;却常常隐藏着一些令人意想不到的陷阱&#xff0c;尤其是当涉及到浅拷贝时。今天&#xff0c;我们将深入探讨Python列表浅拷贝现象及产生原因&#xff0c;并提供有效的解决方案&#xff0c;帮助你写出更…

Mysql Innodb存储引擎原理—链接如下

Mysql Innodb存储引擎| ProcessOn免费在线作图,在线流程图,在线思维导图 ProcessOn是一个在线协作绘图平台&#xff0c;为用户提供强大、易用的作图工具&#xff01;支持在线创作流程图、思维导图、组织结构图、网络拓扑图、BPMN、UML图、UI界面原型设计、iOS界面原型设计等。同…

Excel--复制粘贴时怎么跳过隐藏的行和列

方法一 比如如何跳过下面的行复制其他 首先将黄色的背景行按CTRL0隐藏起来 打开定位条件 选择可见单元格&#xff0c;点击确定 然后复制表格粘贴即可 方法二 首先将不需要的行和列隐藏起来&#xff0c;按Alt&#xff1b;锁定可见单元格。 复制粘贴即可&#xff0c;这样粘贴的…

解锁编程潜力,从掌握GitHub开始

目录&#xff1a; 一、搜索开源项目 1、什么是Git 2、Github常用词含义 3、一个完整的项目界面 4、使用Github搜索项目 1&#xff09;in关键词 2&#xff09;star或fork数量去查找 3&#xff09;awesome加强搜索 二、访问速度慢的解决 1、使用网易UU加速器 2、使用…

redisservice jsonobect 转list

redis里存的是json&#xff0c;但是json的格式是list 怎么取出来呢 JSONArray cacheObject (JSONArray) redisService.getCacheObject("sys_dict:dispute_data_source_hn");Class<SysDictData> sysDictDataClass SysDictData.class;List<SysDictData>…

日历时钟怎么设置?桌面日历时钟设置方法

大家好&#xff0c;今天小编给大家介绍一下&#xff0c;日历时钟怎么设置&#xff1f;桌面日历时钟设置方法 第一&#xff1a;先安装《芝麻时钟》这个桌面时钟软件&#xff0c;这个桌面时钟软件非常的强大&#xff0c;可以在桌面显示各种各样的时钟&#xff0c;各种时钟风格大…

ubuntu20.04搭建vue开发环境

1、当前系统版本 cat /etc/issue 2、nodejs安装 sudo apt install nodejs 查看nodejs版本 3、npm安装 sudo apt install npm 查看npm版本 npm -v 4、Vue安装 sudo npm install -g vue-cli 查看版本和是否安装成功 5、创建vue项目 sudo vue init webpack vuedemo 6、运行…

C++之数据类型

//宏常量define&#xff08;注意书写格式&#xff09; #define a 7 //const修饰变量 const int b 365; 命名规则 数据类型之整型&#xff1a; sizeof&#xff08;&#xff09;&#xff1a;求数据类型所占空间大小&#xff0c;字节数 数据类型之实型&#xff08;浮点数&#…

如何使用命令行快速下载Google Drive/OneDrive大文件

OneDrive OneDrive使用wget下载会出现403 forbidden&#xff0c;可通过下面方法下载。 浏览器右键进入检查界面&#xff0c;选择netowork&#xff0c;搜索download.aspx&#xff0c;然后在待下载文件处点击下载&#xff0c;即可出现下载链接&#xff0c;复制为cURL即可下载。…

STM32 之 SDRAM 详解

目录 前言 一、SDRAM 简介 二、SDRAM的组成原理 2.1存储单元阵列 2.1.1地址译码 2.1.2存储电容 2.2控制逻辑 2.2.1时钟同步 2.2.2命令解码 2.2.3模式寄存器 2.3数据输入 / 输出缓冲 2.3.1数据总线 2.3.2数据锁存 2.4刷新电路 2.4.1自动刷新 2.4.2自刷新 三、S…

Parsec问题解决方案

Parsec目前就是被墙了&#xff0c;有解决方案但治标不治本&#xff0c;如果想稳定串流建议是更换稳定的串流软件&#xff0c;以下是一些解决方案 方案一&#xff1a;在%appdata%/Parsec/config.txt中&#xff0c;添加代理 app_proxy_address 127.0.0.1 app_proxy_scheme http…

每日OJ_牛客_乒乓球筐(字符串模拟)

目录 牛客_乒乓球筐&#xff08;简单模拟&#xff09; 解析代码 牛客_乒乓球筐&#xff08;简单模拟&#xff09; 乒乓球筐__牛客网 nowcoder有两盒&#xff08;A、B&#xff09;乒乓球&#xff0c;有红双喜的、有亚力亚的……现在他需要判别A盒是否包含了B盒中所有的种类&a…

Win10安装.net FrameWork3.5失败解决方法

win10安装.net FrameWork3.5失败解决方法 已经好久没有来投稿了,实在最近业务缠身,忙的焦头烂额(呵~多么伟大的牛马) 但最近开发使用windows11实在是拉胯的不行,升级完就后悔,所以就一怒之下,重装了win10 可是,好家伙,我重装完遇到一个问题,就是在使用.Net Framework3.5,按照Mi…