「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。
引言
-
作用:监听控件的某些事件、使用代理模式,是为了在程序直接"解耦"
-
代理的含义:遵守协议,预先定义好方法,不实现,具体的实现工作由代理负责。
<控件的名字+DataSource> 定义的与数据有关的方法,通常有返回参数
<控件的名字+Delegate> 定义的与事件有关的方法,通常用来监听控件事件的,通常没有返回值
* 方法名以控件名称开头(没有类前缀) -> 方便程序员编写的时候,快速找到需要的协议方法 * 第一个参数是自己 -> 意味着在协议方法中,可以直接访问对象的属性,或者调用方法 * 代理方法的返回值 -> 控制器向控件(委托)发送数据
I delegate
父控件(视图控制器)监听子控件的事件,当子控件发生某些事情的时候,通知父控件工作--备注:父控件通知子控件工作,直接调用子控件的方法即可。
如果使用强引用,将造成循环的强引用-->儿子只能对父亲进行弱引用。
@property (nonatomic,weak) id<HSGroupBuyingFooterViewDelegate> delegate;//在oc中,只有没有强用的时候,才会被立即释放;一旦自定义视图称为视图控制器的视图包含,极自定义视图为视图控制器的儿子时,且视图控制器为自定义视图(儿子)的代理,此时如果代理是强引用,将造成循环的强引用,”你中有我,我中有你“。--永远呆在内存
1.1 delegate的使用场合
- 对象A内部发生了一些事情,想通知对象B,对象A想传递数据给对象B
- 对象B想监听对象A内部发生了什么事情
- 对象A想在自己的方法内部调用对象B的某些方法,并且对象A不能对对象B有耦合依赖
1.2 使用delegate的步骤
- 搞清楚谁 是 谁的 delegate
- 定义代理协议(协议名称的命名规范:控件类名+Delegate)
- 定义代理方法: *代理方法一般都定义为optional *代理方法名称都以空间名开头;代理方法至少有个参数,用于将控件本事传递出去
- 设置代理对象(代理对象遵守协议,并实现协议方法)
- 在恰当的时刻调用delegate的协议方法,来通知delegate发生了什么事情(在调用之前判断代理是否实现了该代理方法)
1.3 代理例子
UITableView表格可以显示非常丰富的数据,为了达到这一效果,设置表格的"数据源"UITableViewDataSource。
@required 必须实现的方法 @optional 可选的实现方法->不强求实现->如果实现了能得到特殊的效果,如果不实现,也不影响程序的正常运行, 能够增加控件的灵活度。
<UITableViewDataSource&UITableViewDelegate> 方法分析小结
#pragma mark - 代理方法
/**
一、表格工作观察的小结
1、numberOfRowsInSection要知道每组的总共有多少数据-》
2、heightForRowAtIndexPath计算每行行高
作用:
1》此方法的提前调用,是为了计算contentSize,因为UITableView继承自UIScrollView,UIScrollView 要指定了contentsize之后才能滚动
2》 确定屏幕应该显示多少行,也就确定了cellForRowAtIndexPath执行次数
-》
3、cellForRowAtIndexPath表格明细,懒加载--只有要显示的cell才会被实例化
二、UITableView行高设置的小结论---时刻关注性能问题
1、代理方法heightForRowAtIndexPath:优先级高于[_tableView setRowHeight:80];
应用场景:每一行的高度都不一样,例如新浪微博;但效率差
2、[_tableView setRowHeight:80]; 效率更高,适用于所有的cell高度一致的场景
*/
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"%s---------row-------%d",__func__,indexPath.row);
return (indexPath.row % 2) ? 60 : 44;//YES被定义为1
// return 44;可以使用[_tableView setRowHeight:80]替换,效率会更好
}
see also
🍅 联系作者: iOS逆向(公号:iosrev)
🍅 作者简介:CSDN 博客专家认证🏆丨全站 Top 50、华为云云享专家认证🏆、iOS逆向公号号主
🍅 简历模板、技术互助。关注我,都给你。