还是回顾、巩固学过的知识点,当有一定代码量时,其实程序猿最需要的是逻辑、思维。
一:我这里用的是plist文件数据显示列表,首先第一步是将数据加载
当然懒加载是最好的方式 ,将加载的数据存储在模型中,便于获取数据,耦合性低
这里思路大致说一下,qq列表其实就是一个tableview的闭合及展开,当点击时展开列表,这时候你把它(cell)当做一个有组头和行的cell,当点击闭合时,这时候你把它(cell)当做一个没有行只有组头的cell。所以这时候需要进行判断是闭合还是展开,我用的是bool值,取反就行,因为点击的是组,所有你需要使用代理,将值传递到controller中,然后实现代理方法,刷新tableview即可
#import "QQTableViewController.h"
#import "QQTableViewHeaderCell.h"
#import "QQGroupView.h"
#import "QQTableViewCell.h"
#import "QQListView.h"
@interface QQTableViewController ()<UITableViewDelegate,UITableViewDataSource,QQTableViewHeaderCellDetegate>
@property (nonatomic,strong)NSArray *modelArr;
@end
@implementation QQTableViewController
-(NSArray *)modelArr{
if (_modelArr ==nil){
NSString *path = [[NSBundle mainBundle]pathForResource:@"friends.plist" ofType:nil];
NSArray * arr = [NSArray arrayWithContentsOfFile:path];
//存放模型
NSMutableArray * mutabArr = [NSMutableArray array];
for (NSDictionary *dict in arr){
QQGroupView * droupModel = [QQGroupView QQGroupDIict:dict];
[mutabArr addObject:droupModel];
}
_modelArr = mutabArr;
}
return _modelArr;
}
- (void)viewDidLoad{
[super viewDidLoad];
self.tableView.delegate = self;//代理
self.tableView.dataSource = self;
self.tableView.sectionHeaderHeight = 45;//组高
}
几个重要的协议必须实现,这里我只说需要注意的
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
QQGroupView * droupModel = self.modelArr[section];
//刚运行进入为no之后点击cell组头取反,就为yes
if (droupModel.StateType) {
return droupModel.friends.count;
}else{
return 0;
}
}
#pragma mark -自定义组标题
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
QQGroupView * droupModel = self.modelArr[section];
//得到组对象
QQTableViewHeaderCell *headerCell =[QQTableViewHeaderCelltableViewHeader:tableView];
//将模型数据设置给组
headerCell.headerModel = droupModel;
headerCell.detegate = self;
headerCell.tag = section;//给每组一个标识
return headerCell;
}
这是最开始运行的界面,之后点击就展开cell
点击组就展开cel数据,也就是显示cell行数据 ,这时就在自定义组中进行数据传递
#pragma mark ----加载模型数据
-(void)setHeaderModel:(QQGroupView *)headerModel{
_headerModel = headerModel;
[_lableBut setTitle:headerModel.nameforState:UIControlStateNormal];
_textLable.text = [NSStringstringWithFormat:@"%@/%ld",headerModel.online,headerModel.friends.count];
//将图片旋转90度
if (self.headerModel.StateType) {
_lableBut.imageView.transform =CGAffineTransformMakeRotation(M_PI_2);
}else{
_lableBut.imageView.transform =CGAffineTransformMakeRotation(0);
}
//当frame发生变化时就执行
-(void)layoutSubviews{
_lableBut.frame =CGRectMake(0, 0, CGRectGetWidth(self.bounds),CGRectGetHeight(self.bounds));
_textLable.frame =CGRectMake(250,0, 150, CGRectGetHeight(self.bounds));
}
//点击组中按钮属性时,响应协议方法,这时候controller就会实现协议方法进而刷新tableview
-(void)ButAction:(UIButton *)sender{
self.headerModel.state = !self.headerModel.state;
if ([self.detegaterespondsToSelector:@selector(QQtablehData:)]) {
[self.detegateQQtablehData:self];//使用代理,,让控制器刷新数据
}
}
#pragma mark - 实现组自定义协议方法
-(void)QQtablehData:(QQTableViewHeaderCell *)headerCell{
// [self.tableView reloadData];刷新全部数据
//刷新局部数据
NSIndexSet * index = [NSIndexSetindexSetWithIndex:headerCell.tag];
[self.tableViewreloadSections:index withRowAnimation:UITableViewRowAnimationAutomatic];
}
总结:其实最重要就是cell中行的显示和隐藏,需要源码的朋友
http://download.csdn.net/detail/json_6/9468005