核心思想:
聲明一個(gè)協(xié)議和方法,別人遵守你的協(xié)議,幫你做事。
先對比一下:
Objective-C 代理模式
Objective-C 中用代理實(shí)現(xiàn)反向傳值:
先看看效果:

委托方(子控制器)
委托方需要實(shí)現(xiàn)
1、創(chuàng)建協(xié)議 、聲明協(xié)議方法。
@protocol SubViewDelegate <NSObject>
- (void)backWithStr:(NSString *) str;
@end
2、創(chuàng)建一個(gè)代理屬性
// weak聲明
@property (nonatomic, weak) id<SubViewDelegate> delegate;
3、執(zhí)行協(xié)議方法
// 判斷代理是實(shí)現(xiàn)該方法,避免carsh
if ([self.delegate respondsToSelector:@selector(backWithStr:)]) {
[self.delegate backWithStr:self.textField.text];
}
代理方(主控制器)
代理方需要實(shí)現(xiàn):
4、遵守(繼承)協(xié)議
@interface ViewController () <SubViewDelegate>
5、將代理設(shè)為自己(誰繼承協(xié)議誰就把自己設(shè)置成self)
subVC.delegate = self;
6、實(shí)現(xiàn)代理方法
- (void)backWithStr:(NSString *)str {
self.label.text = str;
}
Swift 代理模式
其實(shí)一樣的,語法有點(diǎn)不一樣而已。
Swift 中用代理實(shí)現(xiàn)反向傳值:
和上面的效果圖一樣。
委托方(子控制器)
a、創(chuàng)建協(xié)議 、聲明協(xié)議方法
protocol SubViewDelegate {
func backStr(str: String)
}
b、創(chuàng)建一個(gè)代理屬性
weak var delegate: SubViewDelegate?
c、執(zhí)行協(xié)議方法
// 執(zhí)行代理方法,將值回傳
delegate?.backStr(str: textField.text ?? "")
代理方(主控制器)
d、繼承協(xié)議
class ViewController: UIViewController, SubViewDelegate
e、將代理設(shè)為自己
subVC.delegate = self
f、實(shí)現(xiàn)代理方法
func backStr(str: String) {
self.textF.text = str
}
實(shí)戰(zhàn):
需求:點(diǎn)擊 titleViewLabel 監(jiān)聽下面的 connectionViewCell。

紫色的是 connectionViewCell
首先:在 PageTitleView.swift 聲明 協(xié)議
// 要使 titleView 和它下面的 connectionView 有關(guān)聯(lián),可以使用代理、通知等。
//這里使用代理實(shí)現(xiàn)
// 后面使用: class 表示只能被 class類使用
// a、定義協(xié)議
protocol PageTitleViweDelegate : class {
func pageTitleView(titleView : PageTitleView,selectedIndex index : Int)
}
然后:在該P(yáng)ageTitleView.swift類
// b、設(shè)置一個(gè)屬性 delegate
weak var delegate : PageTitleViweDelegate?
最后: 在觸發(fā)的時(shí)候 通知代理
//c、通知代理 (代理的第三步,現(xiàn)在要找一個(gè)別人成為我的代理就可以了,
// 去homeviewController)
delegate?.pageTitleView(titleView: self, selectedIndex: currentIndex)
}
代理方(主控制器)
首先:HomeViewController.swift類包含collectionViewCell
// d、代理的第四步(讓別人成為PageTitleView的代理)
titleView.delegate = self;
最后: 繼承協(xié)議、實(shí)現(xiàn)代理方法(由于swift語法的原因,寫在extension里2步都包含了)
// MARK:- 遵守PageTitleViewDelete 協(xié)議
// 代理 第 5步,別人遵守協(xié)議(實(shí)現(xiàn)代理方法)
extension HomeViewController : PageTitleViweDelegate {
func pageTitleView(titleView: PageTitleView, selectedIndex index: Int) {
print("點(diǎn)擊了代理的:\(index)");
}
}
最終點(diǎn)擊就會打印如下效果,說明成功了。
