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. Programming internal SRAM over SWD

    https://github.com/MarkDing/swd_programing_sram // // Copyright (c) 2013 SILICON LABORATORIES, INC. ...

  2. linux虚拟机与winodows共享文件夹----linux安装VMware tools

    虚拟机里面想要获取原来本机 系统的文件,十分麻烦.为了实现原系统与虚拟机的共享文件夹,可以通过安装vmware tools达到共享目的.   1 安装vmware tools (1)检查虚拟机上是否挂 ...

  3. 在ASP.NET MVC中使用Knockout实践09,自定义绑定

    Knockout真正强大之处在于绑定机制,通过data-bind属性值体现绑定,不仅可以绑定值,还可以绑定事件,甚至可以自定义绑定. 从一个例子看Knockou的绑定机制 假设想给一个button元素 ...

  4. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  5. excel 批注

    Excel VBA之Name对象.Comment对象及字体设置等,点滴学习积累 存在的方式 百家号11-1518:46 ======================================== ...

  6. java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams

    java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.w ...

  7. spring mvc改动配置文件路径

    1.1.  Classpath project文件夹 在web.xml文件例如以下配置: <!-- 配置spring mvc 的核心servlet --> <servlet> ...

  8. SharePoint Set-SPUser 命令拒绝访问

    · 前言 最近碰到一个问题,由于User Profile Service服务有问题,用户信息无法更新.所以,想到Set-SPUser命令可以更新,于是乎找到这个命令,但是更新的时候发现拒绝访问的错误. ...

  9. VS2010Web默认的浏览器设置和VS里调试JavaScript代码的设置

    前言 重装系统后,VS调用的Web浏览器不是IE了,VS调式不了JavaScript代码了.这两天一直在试终于搞定了.这里查找的问题当然主要是VS里面调式JavaScript代码了. 第一种方式设置V ...

  10. Android之设备唯一识别

    唯一Android的设备ID String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.AND ...