iOS、swift技术交流!

swift 代理模式

2018-07-07  本文已影响8人  光明程辉

核心思想:

声明一个协议和方法,别人遵守你的协议,帮你做事。

先对比一下:

Objective-C 代理模式

Objective-C 中用代理实现反向传值:
先看看效果:


oc代理实现.gif

委托方(子控制器)

委托方需要实现

1、创建协议 、声明协议方法。

  @protocol SubViewDelegate <NSObject>

  - (void)backWithStr:(NSString *) str;

  @end

2、创建一个代理属性

// weak声明 
@property (nonatomic, weak) id<SubViewDelegate> delegate;

3、执行协议方法

 // 判断代理是实现该方法,避免carsh
if ([self.delegate respondsToSelector:@selector(backWithStr:)]) {
    [self.delegate backWithStr:self.textField.text];
 }

代理方(主控制器)

代理方需要实现:

4、遵守(继承)协议

  @interface ViewController () <SubViewDelegate>

5、将代理设为自己(谁继承协议谁就把自己设置成self)

subVC.delegate = self;

6、实现代理方法

- (void)backWithStr:(NSString *)str {
    self.label.text = str;
}

Swift 代理模式

其实一样的,语法有点不一样而已。
Swift 中用代理实现反向传值:
和上面的效果图一样。

委托方(子控制器)

a、创建协议 、声明协议方法

protocol SubViewDelegate {
    func backStr(str: String)
 }

b、创建一个代理属性

weak var delegate: SubViewDelegate?

c、执行协议方法

 // 执行代理方法,将值回传
delegate?.backStr(str: textField.text ?? "")

代理方(主控制器)

d、继承协议

class ViewController: UIViewController, SubViewDelegate

e、将代理设为自己

   subVC.delegate = self

f、实现代理方法

func backStr(str: String) {
  self.textF.text = str
}

实战:

需求:点击 titleViewLabel 监听下面的 connectionViewCell。


代理.png

紫色的是 connectionViewCell

首先:在 PageTitleView.swift 声明 协议

// 要使 titleView 和它下面的 connectionView 有关联,可以使用代理、通知等。
 //这里使用代理实现
// 后面使用: class 表示只能被 class类使用
// a、定义协议
protocol PageTitleViweDelegate : class {
    func pageTitleView(titleView : PageTitleView,selectedIndex index : Int)
}

然后:在该PageTitleView.swift类

// b、设置一个属性 delegate 
weak var delegate : PageTitleViweDelegate?

最后: 在触发的时候 通知代理

//c、通知代理 (代理的第三步,现在要找一个别人成为我的代理就可以了,
// 去homeviewController)
    delegate?.pageTitleView(titleView: self, selectedIndex: currentIndex)
}

代理方(主控制器)

首先:HomeViewController.swift类包含collectionViewCell

 // d、代理的第四步(让别人成为PageTitleView的代理)
 titleView.delegate = self;

最后: 继承协议、实现代理方法(由于swift语法的原因,写在extension里2步都包含了)

// MARK:- 遵守PageTitleViewDelete 协议
// 代理 第 5步,别人遵守协议(实现代理方法)
extension HomeViewController : PageTitleViweDelegate {
    func pageTitleView(titleView: PageTitleView, selectedIndex index: Int) {
    print("点击了代理的:\(index)");
  }
}

最终点击就会打印如下效果,说明成功了。


效果.png
上一篇 下一篇

猜你喜欢

热点阅读