你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發UI篇—使用UItableview完成一個簡單的QQ好友列表(二)

iOS開發UI篇—使用UItableview完成一個簡單的QQ好友列表(二)

編輯:IOS開發綜合
實現代碼   1.數據模型部分    YYQQGroupModel.h文件   復制代碼  1 //  2 //  YYQQGroupModel.h  3 //  02-QQ好友列表(基本數據的加載)  4 //  5 //  Created by apple on 14-5-31.  6 //  Copyright (c) 2014年 itcase. All rights reserved.  7 //  8   9 #import <Foundation/Foundation.h> 10  11 @interface YYQQGroupModel : NSObject 12 /** 13  *  名稱屬性 14  */ 15 @property(nonatomic,copy)NSString *name; 16 /** 17  *  是否在線 18  */ 19 @property(nonatomic,copy)NSString *online; 20 /** 21  *  好友列表 22  */ 23 @property(nonatomic,strong)NSArray *friends; 24  25 //記錄當前組是否要打開 26 @property(nonatomic,assign,getter = isOpen)BOOL open; 27  28 -(instancetype)initWithDict:(NSDictionary *)dict; 29 +(instancetype) qqGroupModelWithDict:(NSDictionary *)dict; 30 @end 復制代碼  YYQQGroupModel.m文件   復制代碼  1 //  2 //  YYQQGroupModel.m  3 //  02-QQ好友列表(基本數據的加載)  4 //  5 //  Created by apple on 14-5-31.  6 //  Copyright (c) 2014年 itcase. All rights reserved.  7 //  8   9 #import "YYQQGroupModel.h" 10 #import "YYFriendsModel.h" 11  12 @implementation YYQQGroupModel 13 -(instancetype)initWithDict:(NSDictionary *)dict 14 { 15     if (self=[super init]) { 16         //將字典轉換為模型 17         [self setValuesForKeysWithDictionary:dict]; 18          19         //定義一個數組來保存轉換後的模型 20         NSMutableArray *models=[NSMutableArray arrayWithCapacity:self.friends.count]; 21         for (NSDictionary *dict in self.friends) { 22             YYFriendsModel *friends=[YYFriendsModel friendsWithDict:dict]; 23             [models addObject:friends]; 24         } 25         _friends=[models copy]; 26     } 27     return self; 28 } 29  30 +(instancetype)qqGroupModelWithDict:(NSDictionary *)dict 31 { 32     return  [[self alloc]initWithDict:dict]; 33 } 34 @end 復制代碼 YYFriendsModel.h文件   復制代碼  1 //  2 //  YYFriendsModel.h  3 //  02-QQ好友列表(基本數據的加載)  4 //  5 //  Created by apple on 14-5-31.  6 //  Copyright (c) 2014年 itcase. All rights reserved.  7 //  8   9 #import <Foundation/Foundation.h> 10  11 @interface YYFriendsModel : NSObject 12 /** 13  *  每個好友的名稱 14  */ 15 @property(nonatomic,copy)NSString *name; 16 /** 17  *每個好友的頭像 18  */ 19 @property(nonatomic,copy)NSString *icon; 20 /** 21  *  每個好友的個性簽名 22  */ 23 @property(nonatomic,copy)NSString *intro; 24 /** 25  *  該好友是否是vip 26  */ 27 @property(nonatomic,assign,getter = isVip)BOOL vip; 28  29 -(instancetype)initWithDict:(NSDictionary *)dict; 30 +(instancetype)friendsWithDict:(NSDictionary *)dict; 31 @end 復制代碼 YYFriendsModel.m文件   復制代碼  1 //  2 //  YYFriendsModel.m  3 //  02-QQ好友列表(基本數據的加載)  4 //  5 //  Created by apple on 14-5-31.  6 //  Copyright (c) 2014年 itcase. All rights reserved.  7 //  8   9 #import "YYFriendsModel.h" 10  11 @implementation YYFriendsModel 12 -(instancetype)initWithDict:(NSDictionary *)dict 13 { 14     if (self=[super init]) { 15         [self setValuesForKeysWithDictionary:dict]; 16     } 17     return self; 18 } 19  20 +(instancetype)friendsWithDict:(NSDictionary *)dict 21 { 22     return [[self alloc]initWithDict:dict]; 23 } 24 @end 復制代碼 2.視圖部分   YYfriendCell.h文件   復制代碼  1 //  2 //  YYfriendCell.h  3 //  02-QQ好友列表(基本數據的加載)  4 //  5 //  Created by apple on 14-5-31.  6 //  Copyright (c) 2014年 itcase. All rights reserved.  7 //  8   9 #import <UIKit/UIKit.h> 10 @class YYFriendsModel; 11 @interface YYfriendCell : UITableViewCell 12  13 @property(nonatomic,strong)YYFriendsModel *friends; 14  15 +(instancetype)cellWithTableview:(UITableView *)tableView; 16 @end 復制代碼 YYfriendCell.m文件   復制代碼  1 //  2 //  YYfriendCell.m  3 //  02-QQ好友列表(基本數據的加載)  4 //  5 //  Created by apple on 14-5-31.  6 //  Copyright (c) 2014年 itcase. All rights reserved.  7 //  8   9 #import "YYfriendCell.h" 10 #import "YYFriendsModel.h" 11 //私有擴展 12 @interface YYfriendCell() 13  14  15 @end 16 @implementation YYfriendCell 17  18 +(YYfriendCell *)cellWithTableview:(UITableView *)tableView 19 { 20     static NSString *identifier=@"qq"; 21     YYfriendCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier]; 22     if (cell==nil) { 23         //這裡使用系統自帶的樣式 24         cell=[[YYfriendCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier]; 25         NSLog(@"創建一個cell"); 26     } 27     return cell; 28 } 29  30 -(void)setFriends:(YYFriendsModel *)friends 31 { 32     _friends=friends; 33     //1.設置頭像 34     self.imageView.image=[UIImage imageNamed:_friends.icon]; 35        //2.設置昵稱 36     self.textLabel.text=_friends.name; 37      38      //3.設置簡介 39     self.detailTextLabel.text=_friends.intro; 40  //判斷是否是會員 41      42     /** 43      *  這裡有個注意點,如果不寫else設置為黑色,會怎麼樣? 44      */ 45     if (_friends.isVip) { 46         [self.textLabel setTextColor:[UIColor redColor]]; 47     }else 48     { 49     [self.textLabel setTextColor:[UIColor blackColor]]; 50     } 51      //調整字體的大小 52     self.textLabel.font=[UIFont systemFontOfSize:15.f]; 53     self.detailTextLabel.font=[UIFont systemFontOfSize:10.f]; 54 } 55 @end 復制代碼 YYHeaderView.h文件   復制代碼  1 //  2 //  YYHeaderView.h  3 //  02-QQ好友列表(基本數據的加載)  4 //  5 //  Created by apple on 14-6-1.  6 //  Copyright (c) 2014年 itcase. All rights reserved.  7 //  8   9 #import <UIKit/UIKit.h> 10  11 @class YYQQGroupModel,YYHeaderView; 12  13 //商量一個協議 14 @protocol YYHeaderViewDelegate <NSObject> 15 -(void)headerViewDidClickHeaderView:(YYHeaderView *)headerView; 16 @end 17  18 @interface YYHeaderView : UITableViewHeaderFooterView 19  20 @property(nonatomic,strong)YYQQGroupModel *group; 21 //提供一個類方法,創建一個頭部視圖 22 +(instancetype)headerWithTableView:(UITableView *)tableView; 23  24  25 //delegate遵守YYHeaderViewDelegate這個協議,可以使用協議中的方法 26 @property(nonatomic,weak)id<YYHeaderViewDelegate> delegate; 27 @end 復制代碼 YYHeaderView.m文件   復制代碼   1 //   2 //  YYHeaderView.m   3 //  02-QQ好友列表(基本數據的加載)   4 //   5 //  Created by apple on 14-6-1.   6 //  Copyright (c) 2014年 itcase. All rights reserved.   7 //   8    9 #import "YYHeaderView.h"  10 #import "YYQQGroupModel.h"  11   12 @interface YYHeaderView()  13 @property(nonatomic,strong)UIButton *btn;  14 @property(nonatomic,strong)UILabel *lab;  15 @end  16 @implementation YYHeaderView  17   18   19 //創建一個自定義的頭部分組視圖  20 +(instancetype)headerWithTableView:(UITableView *)tableView  21 {  22     static NSString *indentifier=@"header";  23     //先到緩存池中去取數據  24     YYHeaderView *headerview=[tableView dequeueReusableCellWithIdentifier:indentifier];  25     //如果沒有,則自己創建  26     if (headerview==nil) {  27         headerview=[[YYHeaderView alloc]initWithReuseIdentifier:indentifier];  28     }  29     //返回一個頭部視圖  30     return headerview;  31 }  32   33 #warning 注意在構造方法中為控件設置的frame是無效的  34 -(id)initWithReuseIdentifier:(NSString *)reuseIdentifier  35 {  36     //初始化父類中的構造方法  37     if (self=[super initWithReuseIdentifier:reuseIdentifier]) {  38         //創建一個按鈕  39         UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];  40         //設置按鈕的屬性  41         //設置普通狀態下按鈕的背景圖片  42         [btn setBackgroundImage:[UIImage imageNamed:@"buddy_header_bg"] forState:UIControlStateNormal];  43         //設置高亮狀態下按鈕的背景圖片  44         [btn setBackgroundImage:[UIImage imageNamed:@"buddy_header_bg_highlighted"] forState:UIControlStateHighlighted];  45           46         //設置按鈕上的小三角圖片  47         [btn setImage:[UIImage imageNamed:@"buddy_header_arrow"] forState:UIControlStateNormal];  48         //設置按鈕上信息的對其方式為左對齊  49         btn.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;  50         //設置小三角圖片的內邊距  51         btn.contentEdgeInsets=UIEdgeInsetsMake(0, 20, 0, 0);  52         //設置按鈕上文字距離小三角圖片的距離  53         btn.titleEdgeInsets=UIEdgeInsetsMake(0, 20, 0, 0);  54         //設置按鈕上分組標題的文本顏色(默認是白色)  55         //[btn setTintColor:[UIColor blackColor]];  56         [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];  57         //添加按鈕的點擊事件  58         [btn addTarget:self action:@selector(btnOnclick:) forControlEvents:UIControlEventTouchUpInside];  59           60         // 設置btn中的圖片不填充整個imageview  61         btn.imageView.contentMode = UIViewContentModeCenter;  62         // 超出范圍的圖片不要剪切  63                // btn.imageView.clipsToBounds = NO;  64         btn.imageView.layer.masksToBounds = NO;  65           66         //把按鈕添加到視圖  67         [self addSubview:btn];  68         self.btn=btn;  69           70         //創建一個lab  71         UILabel *lab=[[UILabel alloc]init];  72         //設置在線人數的對齊方式為右對齊  73         lab.textAlignment=NSTextAlignmentRight;  74         //設置在線人數的文本顏色為灰色  75         lab.textColor=[UIColor grayColor];  76         [self addSubview:lab];  77         self.lab=lab;  78     }  79     return self;  80 }  81   82   83 -(void)btnOnclick:(UIButton *)btn  84 {  85     NSLog(@"按鈕被點擊了");  86     //修改模型的isopen屬性  87     //1.修改模型數據  88     self.group.open=!self.group.isOpen;  89     //2.刷新表格  90     //(刷新表格的功能由控制器完成,在這裡可以設置一個代理),當按鈕被點擊的時候,就通知代理對表格進行刷新  91     //通知代理  92     if ([self.delegate respondsToSelector:@selector(headerViewDidClickHeaderView:)]) {  93         [self.delegate headerViewDidClickHeaderView:self];  94     }  95 }  96   97 //當控件的frame值改變時,會自動調用該方法,故可以在該方法中設置控件的frame;  98 -(void)layoutSubviews  99 { 100 #warning 一定不要忘記調用父類的方法 101     [super layoutSubviews]; 102     //設置按鈕的frame和頭部視圖一樣大小 103     self.btn.frame=self.bounds; 104      105     //設置lab的frame 106     CGFloat padding=20; 107     CGFloat labW=50; 108     CGFloat labH=self.frame.size.height; 109     CGFloat labY=0; 110     CGFloat labX=self.frame.size.width-padding-labW; 111     self.lab.frame=CGRectMake(labX, labY, labW, labH); 112 } 113  114 #pragma mark - 當一個控件被添加到其它視圖上的時候會調用以下方法 115 // 已經被添加到父視圖上的時候會調用 116 - (void)didMoveToSuperview 117 { 118     NSLog(@"已經添加到視圖了"); 119     // 在這個方法中就快要拿到最新的被添加到tableview上的頭部視圖修改它的圖片 120     if (self.group.isOpen) { 121         //讓小三角圖片向下旋轉 122         self.btn.imageView.transform = CGAffineTransformMakeRotation(M_PI_2); 123     } 124 } 125  126 // 即將被添加到父視圖上的時候會調用 127 - (void)willMoveToSuperview:(UIView *)newSuperview 128 { 129      NSLog(@"將要添加到視圖了"); 130 } 131  132  133 //重寫get方法,設置數據 134 -(void)setGroup:(YYQQGroupModel *)group 135 { 136     _group=group; 137     //設置分組標題 138  139     //self.btn.titleLabel.text=_group.name; 140     #warning 請注意在設置按鈕的文本時,一定要設置按鈕的狀態,像上面這樣設置不會顯示 141     [self.btn setTitle:_group.name forState:UIControlStateNormal]; 142     NSLog(@"%@",self.btn.titleLabel.text); 143     //設置在線人數 144     self.lab.text=[NSString stringWithFormat:@"%@/%d",_group.online,_group.friends.count]; 145 } 146  147 @end 復制代碼 3.控制器部分   YYViewController.h文件   復制代碼  1 //  2 //  YYViewController.h  3 //  02-QQ好友列表(基本數據的加載)  4 //  5 //  Created by apple on 14-5-31.  6 //  Copyright (c) 2014年 itcase. All rights reserved.  7 //  8   9 #import <UIKit/UIKit.h> 10  11 @interface YYViewController : UITableViewController 12  13 @end 復制代碼 YYViewController.m文件   復制代碼   1 //   2 //  YYViewController.m   3 //  02-QQ好友列表(基本數據的加載)   4 //   5 //  Created by apple on 14-5-31.   6 //  Copyright (c) 2014年 itcase. All rights reserved.   7 //   8    9 #import "YYViewController.h"  10 #import "YYQQGroupModel.h"  11 #import "YYfriendCell.h"  12 #import "YYFriendsModel.h"  13 #import "YYHeaderView.h"  14   15 @interface YYViewController ()<YYHeaderViewDelegate>  16 /**  17  *  用來保存所有的分組數據  18  */  19 @property(nonatomic,strong)NSArray *groupFriends;  20 @end  21   22 @implementation YYViewController  23 #pragma mark-懶加載  24 //1.先拿到數據,實現懶加載  25 -(NSArray *)groupFriends  26 {  27     if (_groupFriends==nil) {  28         NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"friends.plist" ofType:nil];  29         NSArray *arrayM=[NSArray arrayWithContentsOfFile:fullpath];  30           31         NSMutableArray *models=[NSMutableArray arrayWithCapacity:arrayM.count];  32         for (NSDictionary *dict in arrayM) {  33             YYQQGroupModel *group=[YYQQGroupModel qqGroupModelWithDict:dict];  34             [models addObject:group];  35         }  36         _groupFriends=[models copy];  37     }  38     return _groupFriends;  39 }  40   41 - (void)viewDidLoad  42 {  43     [super viewDidLoad];  44      self.tableView.sectionHeaderHeight = 100;  45           46 }  47   48 #pragma mark-  設置數據源  49 //返回多少組  50 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  51 {  52     return self.groupFriends.count;  53 }  54 //每組返回多少行  55 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  56 {  57 //    //取出對應的組模型  58         YYQQGroupModel *group=self.groupFriends[section];  59 //    //返回對應組中的好友數  60 //    return group.friends.count;  61       62     //在這裡進行判斷,如果該組收攏,那就返回0行,如果該組打開,就返回實際的行數  63 //    if (group.isOpen) {  64 //        return group.friends.count;  65 //    }else  66 //    {  67 //        return 0;  68 //    }  69       70     if (group.isOpen) {  71         // 代表要展開  72         return group.friends.count;  73     }else  74     {  75         // 代表要合攏  76         return 0;  77     }  78 }  79 //每組每行的內容  80 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  81 {  82     //1.創建cell  83     YYfriendCell *cell=[YYfriendCell cellWithTableview:tableView];  84   85     //2.設置cell  86     YYQQGroupModel *group=self.groupFriends[indexPath.section];  87     YYFriendsModel *friends=group.friends[indexPath.row];  88     cell.friends=friends;  89     //3.返回一個cell  90     return cell;  91 }  92   93   94 #pragma mark - 代理方法  95 // 當一個分組標題進入視野的時候就會調用該方法  96 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section  97 {  98 //    //    1.創建頭部視圖  99 //    UIView *view = [[UIView alloc] init]; 100 //    view.backgroundColor = [UIColor grayColor]; 101 //    //    2.返回頭部視圖 102 //    return view; 103      104     //創建自定義的頭部視圖 105     YYHeaderView *headerview=[YYHeaderView headerWithTableView:tableView]; 106      107     //設置當前控制器為代理 108     headerview.delegate=self; 109     //設置頭部視圖的數據 110     YYQQGroupModel *groupmodel=self.groupFriends[section]; 111     headerview.group=groupmodel; 112     //返回頭部視圖 113     return headerview; 114 } 115  116  117 #pragma mark - YYHeaderViewDelegate 118 -(void)headerViewDidClickHeaderView:(YYHeaderView *)headerView 119 { 120     //重新調用數據源的方法刷新數據 121     [self.tableView reloadData]; 122 } 123 //設置分組頭部標題的高度 124 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 125 { 126     return 30; 127 } 128  129 #pragma mark  隱藏狀態欄 130 -(BOOL)prefersStatusBarHidden 131 { 132     return YES; 133 } 134 @end
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved