- 为什么系统的代理协议的方法 要把代理本身作为参数传进来?
- 如: 系统的
UIScrollViewDelegate
代理协议,
就有很多方法是将代理本身(UIScrollView
),做为方法的参数传入。
如:- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
- 问 : 系统这样设计,有什么好处呢?
- 假设, 有2个
UIScrollView
,设置代理对象为同一个,且遵循了协议。
@interface ViewController ()<UIScrollViewDelegate>
scrollView.delegate = self; scrollTwo.delegate = self;
想知道,2个UIScrollView
滚动时到底滚动的是哪一个UIScrollView
?
-
UIScrollView
的每次滚动,都会调用代理协议的-scrollViewDidScroll:
方法. - 如果在代理协议
UIScrollViewDelegate
的方法声明里,不传入代理本身,是根本无法知道,到底是scrollView
还是scrollTwo
。
- 如: 系统的
- 协议里的方法声明,一般要用
@optional
来修饰-
@optional
修饰的方法,可实现也可不实现. - 协议的方法声明,默认是
@required
(必须实现)
一个协议一般有很多方法声明,在遵守协议的代理方,并不需要实现所有方法. - 既然建议选择
@optional
,那么委托方在调用代理协议的方法A时,要判断代理方是否实现方法A。
respondsToSelector:
否则报错 NSInvalidArgumentException
-
- 代理的使用范围
- 一个对象,一般只能设置一个代理。
假设这个对象只有一个代理属性的情况下。 - 一个对象,能够成为多个对象的代理。
VC是自UITableViewDataSource
,也是UIScrollViewDelegate
的代理@interface ViewController ()<UITableViewDataSource,UITableViewDelegate> -- 设置代理对象 self.tableView.dataSource = self; self.tableView.delegate = self;
- 一个对象,一般只能设置一个代理。
- 命名规范:
代理协议, 类名+Delegate;
代理方法, 以类名开头
- 通知和代理的选择
- 代理: 1个对象只能告诉,另外1个对象发生了什么事。
- 通知: 1个对象能告诉N个对象发生了什么事。
1个对象能知道N个对象发生了什么事。 - 通知比较简单,但是容易出错。
如, "通知名"拼写错误,在编译时不会有任何提示,运行时才会报错。 - 代理比较规范,但有些麻烦。
- 代理和通知都能完成,对象和对象之间的通信!
但是能用"代理"就不用"通知"
也可以看看
- protocol - 协议01基础
- delegate - 代理基础01
- delegate - 代理基础02
- delegate - 代理基础03
- 没有协议的代理-简单实现
- 代理设计模型-自定义
- delegate - ScrollView01
来自于哪里?
- iOS-MJ-UI基础-大神班/临散知识点/delegate-代理基础-03
网友评论