您的位置:首页 > 其它

实现QQ 好友列表

2014-12-01 15:43 316 查看
实现qq好友列表功能:

1,数据分两部分 一个为 FriendGroup 和Friend 
FriendGroup ----->(many) Friend

FriendGroup.h

#import <Foundation/Foundation.h>

@interface FriendGroup : NSObject

@property (nonatomic, strong) NSArray *friends;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger online;

@property (nonatomic, assign, getter = isOpened) BOOL opened;

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

@end

FriendGroup.m  

#import "FriendGroup.h"
#import "Friend.h"

@implementation FriendGroup

- (instancetype)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
NSMutableArray *tempArray = [NSMutableArray array];
for (NSDictionary *dict in _friends) {
Friend *friend = [[Friend alloc] initWithDic:dict];
[tempArray addObject:friend];
}
_friends = tempArray;
}

return self;
}

@end


[self setValuesForKeysWithDictionary:dict]


这行代码主要是为了让dict 的key 跟 FriendGroup 的属性一致 取出Value 自动去设置属性的值。

Friend.h 和 Friend.m的代码跟以上代码类似

ViewController.m   添加UITableView

_tableView=[[UITableView alloc] initWithFrame:CGRectMake(0, 40, self.view.frame.size.width, self.view.frame.size.height-40)];
_tableView.delegate=self;
_tableView.dataSource=self;
_tableView.backgroundColor=[UIColor clearColor];
[self.view addSubview:_tableView];
实现UITableView 的代理方法 :

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [_dataArray count];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
FriendGroup * fg=_dataArray[section];
return fg.isOpened ? fg.friends.count : 0 ;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"cell";
UITableViewCell * cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell==nil) {
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];

}
return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 40;
}

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
HeadView *headView = [HeadView headViewWithTableView:tableView];
headView.delegate = self;
headView.friendGroup = _dataArray[section];
return headView;
}

- (void)clickHeadView
{
[_tableView reloadData];
}


每次点击HeadView 时都要调用一次 reloadData method

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
FriendGroup * fg=_dataArray[section];
return fg.isOpened ? fg.friends.count : 0 ;
}
根据状态判断是否显示显示出好友

HeadView.h

#import <UIKit/UIKit.h>
@class FriendGroup;

@protocol HeadViewDelegate <NSObject>

@optional
- (void)clickHeadView;

@end

@interface HeadView : UITableViewHeaderFooterView

@property (nonatomic, strong) FriendGroup *friendGroup;

@property (nonatomic, weak) id<HeadViewDelegate> delegate;

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

@end
HeadView.m

#import "HeadView.h"
#import "FriendGroup.h"

@interface HeadView()
{
UIButton *_bgButton;
UILabel *_numLabel;
}
@end

@implementation HeadView

+ (instancetype)headViewWithTableView:(UITableView *)tableView
{
static NSString *headIdentifier = @"header";

HeadView *headView = [tableView dequeueReusableCellWithIdentifier:headIdentifier];
if (headView == nil) {
headView = [[HeadView alloc] initWithReuseIdentifier:headIdentifier];
}

return headView;
}

- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithReuseIdentifier:reuseIdentifier]) {
UIButton *bgButton = [UIButton buttonWithType:UIButtonTypeCustom];
[bgButton setBackgroundImage:[UIImage imageNamed:@"buddy_header_bg"] forState:UIControlStateNormal];
[bgButton setBackgroundImage:[UIImage imageNamed:@"buddy_header_bg_highlighted"] forState:UIControlStateHighlighted];
[bgButton setImage:[UIImage imageNamed:@"buddy_header_arrow"] forState:UIControlStateNormal];
[bgButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
bgButton.imageView.contentMode = UIViewContentModeCenter;
bgButton.imageView.clipsToBounds = NO;
bgButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
bgButton.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
bgButton.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
[bgButton addTarget:self action:@selector(headBtnClick) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:bgButton];
_bgButton = bgButton;

UILabel *numLabel = [[UILabel alloc] init];
numLabel.textAlignment = NSTextAlignmentRight;
[self addSubview:numLabel];
_numLabel = numLabel;
}
return self;
}

- (void)headBtnClick
{
_friendGroup.opened = !_friendGroup.isOpened;
if ([_delegate respondsToSelector:@selector(clickHeadView)]) {
[_delegate clickHeadView];
}
}

- (void)setFriendGroup:(FriendGroup *)friendGroup
{
_friendGroup = friendGroup;

[_bgButton setTitle:friendGroup.name forState:UIControlStateNormal];
_numLabel.text = [NSString stringWithFormat:@"%ld/%lu", (long)friendGroup.online, (unsigned long)friendGroup.friends.count];
}

- (void)didMoveToSuperview
{
_bgButton.imageView.transform = _friendGroup.isOpened ? CGAffineTransformMakeRotation(M_PI_2) : CGAffineTransformMakeRotation(0);
}

- (void)layoutSubviews
{
[super layoutSubviews];

_bgButton.frame = self.bounds;
_numLabel.frame = CGRectMake(self.frame.size.width - 70, 0, 60, self.frame.size.height);
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: