菜鸟成长记-QQ列表展示、UITableView强化

还是回顾、巩固学过的知识点,当有一定代码量时,其实程序猿最需要的是逻辑、思维。

一:我这里用的是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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值