QQ好友列表细节归纳
===在控制器===
1.将Main.storyboard对应的的控制器换成自定义的控制器 面板设置
2.设置组高:self.tableView.sectionHeaderHeight = 44;
3.根据组模型特点返回对应行数:return group.open? group.friends.count:0;
4.在viewForHeaderInSection方法里
1)创建自定义的header
2)设置代理
3)传递模型
4)返回这个header
5.实现代理方法
===在自定义的Header类===
.h中
1)定义代理协议
2)类声明,继承:UITableViewHearFooterView
3)定义组模型
4)定义代理
.m中
1)定义类延展:定义所需子控件属性
2)实现
+(instancetype)headerWithTableView:(UITableView *)tableView
3)封装cell重用的代码
4)单写
-(id)initWithReuseIndentifier:(NSString *)reuseIdentifier
5)在给按钮改背景,标题,标题颜色的时候 用set去设置
6)为了让header的子控件frame及时有效,重写-(void)layoutSubviews,在里面设置子控件的frame,当然先[super layoutSubviews];
7)重写setter方法,给组模型,子控件赋值
8)给按钮指定一个点击事件方法
[nameBtn addTarget:self action:@selector(nameClick) forControlEvents:UIControlEventTouchUpInside];
9)亮点:self.group.open = ! self.group.open;
10)判断代理有没有实现代理方法
if([self.delegate respondsToSelector:@selector(groupHeaderClick:)])
静态cell细节归纳
1.UI设计
1)在Main.storyboard删除自动生成的ViewController,拖入一个UITableViewController
2)调尺寸,去自适应
3)选中TableViewController重新关联到ViewController

4)把箭头 storyBoard entry point 调出来?

5)设置tableView的组个数

6)cell设置

QQ列表代码分析
1.头部View自定义实现 继承:UITableViewHeaderFooterView
==完全封装
1)封装cell的过程
+(instancetype)headViewWithTableView:(UITableView *)tableView
2)重写-(instacetype)initWithReuseIndentifier
1.实现父类 initWithReuseIndentifier
2.添加子控件:设置背景,设置内边距,添加事件
设置按钮内容水平对齐方式
nameView.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
设置按钮内容上左下右的内间距
nameView.contentEdgeInsets = UIEdgeInsetsMake(0,10,0,0);
设置按钮标题上左下右的间距
nameView.contentEdgeInsets = UIEdgeInsetsMake(0,10,0,0);
按钮添加点击事件
[nameView addTarget:self action:@selector(nameViewClick) forControlEvents:UIControlEventTouchUpInside];
按钮中小三角的旋转处理
nameView.imageView.contentMode = UIViewContentModeCenter;
nameView.imageView.clipsToBounds = NO;
3)重写-(void)layoutSubviews方法:
a:要实现父类的(不实现会导致控件上的点击事件失效)
b:在这里设置子控件的frame的原因:初始化时,当前headView的frame还没有值,这个方法可以监听当前控件什么时候有值
,只有headView的frame有值,给它的子控件的frame赋值才有意义
4)给数据模型赋值,子控件赋值放在这个setter方法里
给控件的transform赋值
self.nameView.image.transform = CGAffineTransformMakeRotation(M_PI_2);
复位
self.nameView.image.transform = CGAffineTransformIndentify;
5)点击事件
设置代理,在控制器里的headView创建方法里设置
1.cellView自定义实现
==完全封装:本质还是利用自带cell,只不过把创建封装了,并且封装了对应的数据模型
2.懒加载设计
放在主模型类里去做,这样在将主模型添加到数组之前,将次模型去字典转模型,同时将转好的模型数组存放在主模型下定义的一个次模型数组里
将次模型封装在主模型里,当解析数据文件时,一并将每个主模型的次模型数据,放入次模型数组里。
3.将取数据文件放在控制器里加载,和封装在模型里加载区别?