swift 代理模式

核心思想:

聲明一個(gè)協(xié)議和方法,別人遵守你的協(xié)議,幫你做事。

先對比一下:

Objective-C 代理模式

Objective-C 中用代理實(shí)現(xiàn)反向傳值:
先看看效果:


oc代理實(shí)現(xiàn).gif

委托方(子控制器)

委托方需要實(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。


代理.png

紫色的是 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)擊就會打印如下效果,說明成功了。


效果.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容