MVC设计模式与delegate

一、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.定义类

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

2.声明对象

cpp 复制代码
student stu1;

3.对象调用成员函数

cpp 复制代码
stu1.Printf();

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

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

}

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

Swift 复制代码
//一个代理
var delegate:HeaderDelegate?

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

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

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

4.代理对象

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

5.实现函数

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

tableView.dataSource=self

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

tableView.delegate=self

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

那么代理有什么用呢?

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

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

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

Swift 复制代码
protocol classBVCDelegate: AnyObject{
    func changeColor(_ color:UIColor)
}

class BViewController:UIViewController{

weak var delegate:classBVCDelegate?

......

}

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

Swift 复制代码
class AViewController:UIViewController,classBVCDelegate{
......
}

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

Swift 复制代码
func changeColor(_ color:UIColor){
self.backgroundColor = color
}

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

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

Swift 复制代码
    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项目:大佬文章​​​​​​​

相关推荐
zhlx28352 小时前
【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载
macos·ios·cocoa
XZHOUMIN13 小时前
网易博客旧文----编译用于IOS的zlib版本
ios
爱吃香菇的小白菜16 小时前
H5跳转App 判断App是否安装
前端·ios
二流小码农21 小时前
鸿蒙开发:ForEach中为什么键值生成函数很重要
android·ios·harmonyos
hxx2211 天前
iOS swift开发--- 加载PDF文件并显示内容
ios·pdf·swift
B.-1 天前
在 Flutter 应用中调用后端接口的方法
android·flutter·http·ios·https
️ 邪神1 天前
【Android、IOS、Flutter、鸿蒙、ReactNative 】约束布局
android·flutter·ios·鸿蒙·reactnative
️ 邪神2 天前
【Android、IOS、Flutter、鸿蒙、ReactNative 】文本点击事件
flutter·ios·鸿蒙·reactnative·anroid
️ 邪神2 天前
【Android、IOS、Flutter、鸿蒙、ReactNative 】文本Text显示
flutter·ios·鸿蒙·reactnative·anroid
今天也想MK代码2 天前
基于ModelScope打造本地AI模型加速下载方案
ai·语言模型·swift·model·language model