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