前言
委托(delegate)是Cocoa的一個(gè)術(shù)語,表示將一個(gè)對象的部分功能轉(zhuǎn)交給另一個(gè)對象。
比如對象A希望對象B知道將要發(fā)生或已經(jīng)發(fā)生某件事情,對象A可以把對象B的引用存為一個(gè)實(shí)例變量。這個(gè)對象B稱為委托。當(dāng)事件發(fā)生時(shí),它檢查委托對象是否實(shí)現(xiàn)了與該事件相適應(yīng)的方法。如果已經(jīng)實(shí)現(xiàn),則調(diào)用該方法。
由于松耦合的原因,一個(gè)對象能成為多個(gè)對象的委托。某些情況下,相較于通過繼承讓子類實(shí)現(xiàn)相關(guān)的處理方法,可以有效減少代碼復(fù)雜度。所以iOS中也大量的使用了委托。
目標(biāo)
在A類里面聲明一個(gè)ADelegate的代理,B類遵循并使用ADelegate定義的函數(shù)。
實(shí)現(xiàn)
A.swift
//創(chuàng)建協(xié)議
protocol ADelegate:NSObjectProtocol
{
//回調(diào)方法 傳一個(gè)String類型的值
func delegateMethod(string:String)
}
class A: UIViewController
{
weak var delegate:ADelegate?
override func viewDidLoad()
{
super.viewDidLoad()
...
}
func goBack()
{
//調(diào)用代理方法
if delegate != nil
{
delegate?.delegateMethod(string:"123")
self.navigationController?.popToRootViewControllerAnimated(true)
}
}
}
B.swift
class A: UIViewController, ADelegate
{
override func viewDidLoad()
{
super.viewDidLoad()
...
}
//push
func nextPage()
{
let aController = A()
//指定代理
aController.delegate = self
self.navigationController!.pushViewController(aController, animated:true)
}
//接收傳過來的值
func delegateMethod(string:String)
{
...
}
}
總結(jié)
Objective-C中delegate的實(shí)現(xiàn)和Swift中delegate基本一樣的,委托也是iOS編程中常見的一種設(shè)計(jì)模式。在平常使用過程中,要多加注意,才能更加熟練地使用。