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

来源:http://www.cnblogs.com/qianLL/archive/2016/04/06/5361494.html
-Advertisement-
Play Games

本文轉自:http://www.cnblogs.com/wendingding/p/3763330.html 一、項目結構和plist文件 二、實現代碼 1.說明: 主控制器直接繼承UITableViewController // YYViewController.h // 02-QQ好友列表(基本 ...


 

本文轉自:http://www.cnblogs.com/wendingding/p/3763330.html

一、項目結構和plist文件

 

二、實現代碼

1.說明:

主控制器直接繼承UITableViewController

複製代碼
 //  YYViewController.h
//  02-QQ好友列表(基本數據的載入)
//
//  Created by apple on 14-5-31.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface YYViewController : UITableViewController

@end
複製代碼

在storyboard中進行了關聯

2.代碼

數據模型部分:

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 -(instancetype)initWithDict:(NSDictionary *)dict;
26 +(instancetype) qqGroupModelWithDict:(NSDictionary *)dict;
27 @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
複製代碼

視圖部分

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      //3.設置簡介
38     self.detailTextLabel.text=_friends.intro;
39  //判斷是否是會員
40     /**
41      *  這裡有個註意點,如果不寫else設置為黑色,會怎麼樣?
42      */
43     if (_friends.isVip) {
44         [self.textLabel setTextColor:[UIColor redColor]];
45     }else
46     {
47     [self.textLabel setTextColor:[UIColor blackColor]];
48     }
49 }
50 @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 
14 @interface YYViewController ()
15 /**
16  *  用來保存所有的分組數據
17  */
18 @property(nonatomic,strong)NSArray *groupFriends;
19 @end
20 
21 @implementation YYViewController
22 #pragma mark-懶載入
23 //1.先拿到數據,實現懶載入
24 -(NSArray *)groupFriends
25 {
26     if (_groupFriends==nil) {
27         NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"friends.plist" ofType:nil];
28         NSArray *arrayM=[NSArray arrayWithContentsOfFile:fullpath];
29         
30         NSMutableArray *models=[NSMutableArray arrayWithCapacity:arrayM.count];
31         for (NSDictionary *dict in arrayM) {
32             YYQQGroupModel *group=[YYQQGroupModel qqGroupModelWithDict:dict];
33             [models addObject:group];
34         }
35         _groupFriends=[models copy];
36     }
37     return _groupFriends;
38 }
39 
40 - (void)viewDidLoad
41 {
42     [super viewDidLoad];
43      self.tableView.sectionHeaderHeight = 100;
44 }
45 
46 #pragma mark-  設置數據源
47 //返回多少組
48 //為什麼這裡不會智能提示?因為這些方法是uitableview協議里的,預設並沒有遵守協議,讓主控制器類繼承uitableviewcontroller後,就已經遵守了
49 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
50 {
51     return self.groupFriends.count;
52 }
53 //每組返回多少行
54 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
55 {
56     //取出對應的組模型
57     YYQQGroupModel *group=self.groupFriends[section];
58     //返回對應組中的好友數
59     return group.friends.count;
60 }
61 //每組每行的內容
62 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
63 {
64     //1.創建cell
65     YYfriendCell *cell=[YYfriendCell cellWithTableview:tableView];
66 
67     //2.設置cell
68     YYQQGroupModel *group=self.groupFriends[indexPath.section];
69     YYFriendsModel *friends=group.friends[indexPath.row];
70     cell.friends=friends;
71     //3.返回一個cell
72     return cell;
73 }
74 
75 
76 #pragma mark - 代理方法
77 // 當一個分組標題進入視野的時候就會調用該方法
78 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
79 {
80     //    1.創建頭部視圖
81     UIView *view = [[UIView alloc] init];
82     view.backgroundColor = [UIColor grayColor];
83     //    2.返回頭部視圖
84     return view;
85 }
86 
87 //設置分組頭部標題的高度
88 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
89 {
90     return 44;
91 }
92 
93 #pragma mark  隱藏狀態欄
94 -(BOOL)prefersStatusBarHidden
95 {
96     return YES;
97 }
98 @end
複製代碼

實現的簡陋效果:

三、註意點

(1)設置頭部視圖的方法

(2)在重寫set方法時,應該考慮到回滾。

 

 

 

 

一、實現效果

           

二、實現代碼

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.註意點

(1)調整字體的大小:    self.textLabel.font=[UIFont systemFontOfSize:15.f];

(2)-(void)layoutSubviews方法。該方法在控制項的frame被改變的時候就會調用,這個方法一般用於調整子控制項的位置,註意一定要調用[super layoutSubviews];

(3)但凡在init方法中獲取到的frame都是0;

(4)如果控制項不顯示,有以下一些排錯方法

a.frame為空(沒有設置frame) b.hidden是否為YES c.alpha<=0.1(透明度) d.沒有添加到父控制項中 e.查看父控制項以上幾點

(5)請註意在設置按鈕的文本時,一定要設置按鈕的狀態

正確:[self.btn setTitle:_group.name forState:UIControlStateNormal]; 錯誤: self.btn.titleLabel.text=_group.name;

(6)調用構造方法時,一定要先初始化父類的方法,先判斷,再進行自己屬性的初始化

self=[super initWithReuseIdentifier:reuseIdentifier] if(self) { …… } (7)當一個控制項被添加到其它視圖上的時候會調用以下方法

1) 已經被添加到父視圖上的時候會調用- (void)didMoveToSuperview

2) 即將被添加到父視圖上的時候會調用- (void)willMoveToSuperview:(UIView *)newSuperview

(8)圖片填充知識

   1)設置btn中的圖片不填充整個imageview btn.imageView.contentMode = UIViewContentModeCenter;

   2)超出範圍的圖片不要剪切

  //btn.imageView.clipsToBounds = NO;

  btn.imageView.layer.masksToBounds = NO;

四、補充(代理)

設置代理的幾個步驟 (1)如果一個視圖中的某個按鈕被點擊了,這個時候需要去主控制器中刷新數據。有一種做法是,讓這個視圖擁有控制器這個屬性,然後當按鈕被點擊的時候去利用該屬性去做刷新數據的操作。另一種做法是把控制器設置為這個視圖的代理,當視圖中的某個按鈕被點擊的時候,通知它的代理(主控制器)去乾刷新數據這件事。 (2)要成為代理是由條件的,有以下幾個步驟 1).雙方約定一個協議(代理協議,註意命名規範),在視圖中自定義一個協議,協議中提供一個方法。

@protocol YYHeaderViewDelegate <NSObject>

-(void)headerViewDidClickHeaderView:(YYHeaderView *)headerView;

@end

2).在視圖中添加一個id類型的屬性變數,任何人只要遵守了約定協議的都可以成為它的代理。

//delegate遵守YYHeaderViewDelegate這個協議,可以使用協議中的方法

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

3).在控制器中,遵守自定義的代理協議,就可以使用代理提供的方法,在這個方法中對數據進行刷新。

@interface YYViewController ()<YYHeaderViewDelegate>

-(void)headerViewDidClickHeaderView:(YYHeaderView *)headerView

{

    [self.tableView reloadData];

}

4).把控制器設置作為按鈕點擊事件的代理。

headerview.delegate=self;

 

   
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以下問題都是自己在項目中遇到的,解決問題的方法肯定有多種,我所列舉的不一定就是最好的解決辦法。如有問題歡迎大家指正,補充,交流。 解決同時按兩個按鈕進兩個view的問題。[button setExclusiveTouch:YES]; 在6p模擬器上輸出寬度是414,在6p真機上輸出是375是測試機本 ...
  • 代碼: ...
  • 以下是三個IOS開發中最常用的控制項,作為IOS基礎學習教程知識 ,初學者需要瞭解其基本定義和常用設置,以便在開發在熟練運用。 UIButton按鈕 第一、UIButton的定義 UIButton *button=[[UIButton buttonWithType:(UIButtonType); 能夠 ...
  • 一、響應鏈 在IOS開發中會遇到各種操作事件,通過程式可以對這些事件做出響應。 首先,當發生事件響應時,必須知道由誰來響應事件。在IOS中,由響應者鏈來對事件進行響應,所有事件響應的類都是UIResponder的子類,響應者鏈是一個由不同對象組成的層次結構,其中的每個對象將依次獲得響應事件消息的機會 ...
  • 什麼是廣播 什麼是廣播 生活中的電視頻道、收音機、手機、都有自己的特定廣播,他們不管是否有人關心、收聽等,不管你是否看電視,每個頻道都實施按照自己的進步進行播放、收音機也是!所以我理解的android廣播機制也就是這樣--廣播發佈者只負責把發生的事件發出,至於是否有接聽者或者接聽者接收到怎樣處理並不 ...
  • 原文地址:http://blog.csdn.net/wzzvictory/article/details/18269713 出於安全考慮,iOS系統的沙盒機制規定每個應用都只能訪問當前沙盒目錄下麵的文件(也有例外,比如系統通訊錄能在用戶授權的情況下被第三方應用訪問),這個規則把iOS系統的封閉性展現 ...
  • Android開發獲取相冊圖片的方式網上有很多種,這裡說一個Android4.4後的方法,因為版本越高,一些老的api就會被棄用,新的api和老的api不相容,導致出現很多問題。 比如:managedQuery()現在已經被getContentResolver().query()替代了,不過它們的參 ...
  • 最終效果展示: 首先我們需要一個ViewPager控制項,不過可以發現在左側的控制項列表中並沒有這個控制項 這時我們要去升級包中查看 然後在釐米找到 ViewPager.class 這時我們雙擊這個發現不能查看源代碼 我們可以通過以 android-support-v4.jar.properties 的一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...