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. AES advanced encryption standard 3

    This optimized <../aesbench/> AES implementation conforms to FIPS-. aes.h #ifndef _AES_H #defi ...

  2. Embarcadero RAD Studio XE5

    英巴卡迪诺 RAD Studio XE是终极应用程序开发套件,能以最快速方式为Windows.Mac OS X. .NET. PHP. Web和移动设备可视化开发数据丰富.界面美观的跨平台应用程序.R ...

  3. VC2010中"Include Directories" 和 "Additional Include Directories"的区别

    右键一个Project,可以发现有两个地方设置Include的相关目录: 1. VC++ Directories -> Include Directories2. C/C++ -> Gen ...

  4. AngularJS中自定义过滤器

    AngularJS中为我们提供了一些内置的过滤器,这里列举一些自定义过滤器的场景. 自定义过滤器,不带参赛 //过滤 不带参赛 app.filter('ordinal', function () { ...

  5. ASP.NET Identity系列01,揭开神秘面纱

    早在2005年的时候,微软随着ASP.NET 推出了membership机制,十年磨一剑,如今的ASP.NET Identity是否足够强大,一起来体会. 在VS2013下新建项目,选择"A ...

  6. WMAppManifest.xml

    大家在编写Windows phone的程序的时候可能并没有关注WMAppManifest.xml,其实这个档案是记录了应用程式的相关属性描述,以及定义应用程式的功能性的..所以还是相当重要的一个文档, ...

  7. zTree树

    <link rel="stylesheet" href="/static/zTreeV3/css/metroStyle/metroStyle.css" t ...

  8. Android tips(八)-->Android Studio打包apk,aar,jar包

    文本我们将讲解android studio打包apk,aar,jar包的相关知识.apk包就是android系统的安装包,这里没什么好说的,aar包是android中独有的类库包,而jar包是java ...

  9. Android获取actionbar高度和StatusBar高度的方法

    ActionBar: getActionBar().getHeight(); StatusBar: /** * 获取状态栏高度 * * @return */ public static int get ...

  10. UML类图和时序图

    这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图所表达的含义和最终的代码 ...