1.模型

@class FriendsModel;

@interface GroupModel : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *online;

@property (nonatomic, strong) NSArray *friends;

@property (nonatomic, strong) FriendsModel *friendModel;

@property (nonatomic, assign) BOOL isOpen;

- (instancetype)initWithDict:(NSDictionary *)dict;

+ (instancetype)GroupWithDict:(NSDictionary *)dict;

@end

#import "FriendsModel.h"

@implementation GroupModel

- (instancetype)initWithDict:(NSDictionary *)dict{

if (self = [super init])
{

[self setValuesForKeysWithDictionary:dict];

NSMutableArray *muArray = [NSMutableArray array];

for (NSDictionary *dict in self.friends)
{

FriendsModel *model = [FriendsModel friendWithDict:dict];

[muArray addObject:model];

}

self.friends = muArray;

}

return self;

}

+ (instancetype)GroupWithDict:(NSDictionary *)dict

{

return [[self alloc] initWithDict:dict];

}

@end

@interface FriendsModel : NSObject

@property (nonatomic, copy) NSString *icon;

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *intro;

@property (nonatomic, assign) BOOL isVip;

- (instancetype)initWithDict:(NSDictionary *)dict;

+ (instancetype)friendWithDict:(NSDictionary *)dict;

@end

#import "FriendsModel.h"

@implementation FriendsModel

- (instancetype)initWithDict:(NSDictionary *)dict{

if (self = [super init])
{

[self setValuesForKeysWithDictionary:dict];

}

return self;

}

+ (instancetype)friendWithDict:(NSDictionary *)dict{

return [[self alloc] initWithDict:dict];

}

@end


2.tableView UITableViewHeaderFooterView

的继承

@protocol HeaderViewDelegate <NSObject>

@optional

- (void)clickView;

@end

@interface HeaderView : UITableViewHeaderFooterView

@property (nonatomic,assign)id<HeaderViewDelegate>
delegate;

@property (nonatomic,strong) GroupModel *groupModel;

+ (instancetype)headerView:(UITableView *)tableView;

@end

#import "HeaderView.h"

#import “GroupModel.h"

@implementation HeaderView{

UIButton *_arrowBtn;

UILabel  *_label;

}

+ (instancetype)headerView:(UITableView *)tableView

{

staticNSString *identifier =@"header";

HeaderView *header = [tableViewdequeueReusableCellWithIdentifier:identifier];

if (!header) {

header = [[HeaderViewalloc]initWithReuseIdentifier:identifier];

}

return header;

}

- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier

{

if (self = [superinit]) {

UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];

[button setBackgroundImage:[UIImageimageNamed:@"header_bg"]forState:UIControlStateNormal];

[button setBackgroundImage:[UIImageimageNamed:@"header_bg_highlighted"]forState:UIControlStateHighlighted];

[button setImage:[UIImageimageNamed:@"arrow"]forState:UIControlStateNormal];

[button setTitleColor:[UIColorblackColor]forState:UIControlStateNormal];

button.,,,
);

button.contentHorizontalAlignment =UIControlContentHorizontalAlignmentLeft;

button.,,,
);

button.imageView.contentMode =UIViewContentModeCenter;

[button addTarget:selfaction:@selector(buttonAction)forControlEvents:UIControlEventTouchUpInside];

//超出范围的图片不要剪切

button.imageView.clipsToBounds =NO;

_arrowBtn = button;

[selfaddSubview:_arrowBtn];

//创建label,显示当前在线人数

UILabel *labelRight = [[UILabelalloc]init];

labelRight.textAlignment =NSTextAlignmentCenter;

_label = labelRight;

[selfaddSubview:_label];

}

return
self;

}

#pragma mark - buttonAction

- (void)buttonAction

{

self.groupModel.isOpen = !self.groupModel.isOpen;

if ([self.delegaterespondsToSelector:@selector(clickView)])
{

[self.delegateclickView];

}

}

- (void)didMoveToSuperview

{

//通知相关视图他们的上级视图已经变化是当某个子控件载入到父控件上得时候调用

_arrowBtn.imageView.transform =self.groupModel.isOpen ?

CGAffineTransformMakeRotation(M_PI_2)
:CGAffineTransformMakeRotation();

}

//布局

- (void)layoutSubviews

{

[superlayoutSubviews];

_arrowBtn.frame =self.bounds;

_label.frame =CGRectMake(self.frame.size.width
- ,
,self.frame.size.height);

}

//赋值

- (void)setGroupModel:(GroupModel *)groupModel

{

_groupModel = groupModel;

[_arrowBtn setTitle:_groupModel.name forState:UIControlStateNormal];

_label.text = [NSString stringWithFormat:@"%@/%lu",_groupModel.online,(unsignedlong)_groupModel.friends.count];

}

3.控制器

#import "ListTableViewController.h"

#import "GroupModel.h"

#import "FriendsModel.h"

#import "HeaderView.h"

#import "ViewController.h"

@interface
ListTableViewController ()<HeaderViewDelegate>

@property (nonatomic, strong)NSArray *dataArray;

@end

@implementation ListTableViewController

//懒载入

- (NSArray *)dataArray{

if (!_dataArray) {

NSString *path = [[NSBundlemainBundle]pathForResource:@"friends.plist"ofType:nil];

NSArray *array = [NSArrayarrayWithContentsOfFile:path];

NSMutableArray *muArray = [NSMutableArrayarrayWithCapacity:array.count];

for (NSDictionary *dictin array) {

GroupModel *groupModel = [GroupModel GroupWithDict:dict];

[muArray addObject:groupModel];

}

_dataArray = [muArraycopy];

}

return_dataArray;

}

- (void)viewDidLoad

{

[superviewDidLoad];

;//自己定义了sectionHeader一定要设置高

[selfclipExtraCellLine:self.tableView];//数据不够,去掉以下多余的表格线

}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return
self.dataArray.count;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

GroupModel *groupModel =self.dataArray[section];

;

return count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath

{

staticNSString *identifier =@"friendCell";

UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:identifier];

if (!cell) {

cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:identifier];

}

GroupModel *groupModel =self.dataArray[indexPath.section];

FriendsModel *friendModel = groupModel.friends[indexPath.row];

cell.imageView.image = [UIImage imageNamed:friendModel.icon];

cell.textLabel.text = friendModel.name;

cell.detailTextLabel.text = friendModel.intro;

return cell;

}

#pragma mark - UITableView delegate

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

{

HeaderView *header = [HeaderViewheaderView:tableView];

header.delegate =self;

header.groupModel =self.dataArray[section];

return header;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath
*)indexPath

{

ViewController *viewCtrl = [[ViewControlleralloc]init];

//viewCtrl.view.backgroundColor = [UIColor redColor];

[self.navigationControllerpushViewController:viewCtrlanimated:NO];

}

- (void)clickView

{

[self.tableViewreloadData];

}

#pragma mark - 去掉多余的线

- (void)clipExtraCellLine:(UITableView *)tableView

{

UIView *view = [[UIViewalloc]init];

view.backgroundColor = [UIColorclearColor];

[self.tableViewsetTableFooterView:view];

}

/*

设置视图控制颜色

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

self.window.backgroundColor = [UIColor whiteColor];

ListTableViewController *listVC = [[ListTableViewController alloc] init];

UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:listVC];

self.window.rootViewController = navCtrl;

[self.window makeKeyAndVisible];

*/

素材下载地址:http://download.csdn.net/detail/baitxaps/8934111

QQList列表功能实现的更多相关文章

  1. nginx 目录文件列表功能配置

    工作中常常有写不能有网页下载东西的需求,在Apache下搭建完成后直接导入文件即可达到下载/显示文件的效果,而Nginx也可以满足这样的需求(nginx 目录列表功能默认是关闭的),这时就需要配置. ...

  2. HoverTree项目添加了查看留言列表功能

    HoverTree项目添加了查看留言列表功能 页面:HoverTreeWeb项目下hvtpanel/usermessage/messagelist.aspx 添加留言页面:addmessage.asx ...

  3. 【转】如何开启notepad++函数列表功能

    原文网址:http://jingyan.baidu.com/article/4b07be3c41e05e48b380f3f6.html Notepad++是window下特有的一款开源编辑器软件,相信 ...

  4. 开放Nginx在文件夹列表功能

    nginx在列出的默认同意整个文件夹.你怎么转Nginx在文件夹列表功能?打开nginx.conf文件.在location server 要么 http段增加 autoindex on;另外两个參数最 ...

  5. 微信小程序新闻列表功能(读取文件、template模板使用)

    微信小程序新闻列表功能(读取文件.template) 不忘初心,方得始终.初心易得,始终难守. 在之前的项目基础上进行修改,实现读取文件内容作为新闻内容进行展示. 首先,修改 post.wxml 文件 ...

  6. ListView实现丰富的列表功能

    ListView实现丰富的列表功能 1.主布局activity_main.xml <?xml version="1.0" encoding="utf-8" ...

  7. swift 实现QQ好友列表功能

    最近项目中有类似QQ好友列表功能,整理了一下,话不多说,直接上代码 import UIKit class QQFriend: NSObject { var name: String? var intr ...

  8. 13、Django实战第13天:分页列表功能

    我们看课程 机构列表页是需要分页的 为了完成分页功能,我们需要用到Django的一个开源开发库django-pure-pagination workon mxonline pip install dj ...

  9. 基于SpringBoot从零构建博客网站 - 分页显示文章列表功能

    显示文章列表一般都是采用分页显示,比如每页10篇文章显示.这样就不用每次就将所有的文章查询出来,而且当文章数量特别多的时候,如果一次性查询出来很容易出现OOM异常. 后台的分页插件采用的是mybati ...

随机推荐

  1. STM32的PWM输入模式设置并用DMA接收数据

    参考 :STM32输入捕获模式设置并用DMA接收数据 PWM input mode This mode is a particular case of input capture mode. The ...

  2. 微信小程序如何玩转分销

    截止目前,微信月活跃用户已经高达8.89亿,微信这个庞大的互联网巨头下一个目标是什么? 打造属于自己的“AppStore”.小程序正是完成这个微信生态体系的一块完美拼板, 张小龙预言:未来2年内,小程 ...

  3. java系列之 原生数据类型

    在我看来,java里面里面除了原生类型不是对象,其他的都是对象.但java是面向对象的语言,很多地方还要要操作对象,所以java会自动把原生类型转为对应的包装类型.这个过程叫自动装箱.有装箱就有拆箱, ...

  4. linux-socket connect阻塞和非阻塞模式 示例

    ~/cpp$ ./connect 192.168.1.234 1234 kkkk block mode:  ubuntu 14.04 : time used:21.0.001053s connect ...

  5. bind,apply,call的区别

    在Javascript中,bind, apply, call方法都可以显式绑定上下文this,这三者有何不同呢? bind只绑定this不马上执行 var person = { firstname: ...

  6. DXT 图片压缩(DXTC/DirectX Texture Compression Overview)

    这两天在写 DDS 格式的解码程序.DDS 是微软为 DirectX 开发的一种图片格式,MSDN 上可以查到其文件格式说明: http://msdn2.microsoft.com/en-us/lib ...

  7. UINavigationController 、UINavigationBar 、UINavigationItem 超清晰直观详解

    UINavigationController 部分 1. UINavigationController 是一个容器类.里面盛放的是UIViewController. 容器的意思是,如果你不放入UIVi ...

  8. Python:Hello World级别的SimpleDb

    背景 几乎所有的动态语言都支持成员的动态解析,一般的在解析不到成员的时候会给出一个hook点让你自定义一些有意思的实现..Net4之后增加了对动态类型的支持,在动态类型上就有这种机制. 模拟Simpl ...

  9. 行尸走肉第八季/全集The Walking Dead迅雷下载

    <行尸走肉第八季>将在10月22号回归播出, 将于5月1日起正式开始拍摄!目前剧组已开始招募客串演员和丧尸群演,第八季拍摄时长初步预计会持续到11月16日.而这三位已确认为<行尸走肉 ...

  10. 拦截器通过Spring获取工厂类,注入bean对象

    // 这里需要注意一点,我们在拦截器内无法通过SpringBean的方式注入LoggerJPA,我只能通过另外一种形式. /** * 根据传入的类型获取spring管理的对应dao * @param ...