iOS開發UI篇—使用xib自定義UItableviewcell實現一個簡單的團購應用界面佈局

iOS開發UI篇—使用xib自定義UItableviewcell實現一個簡單的團購應用界面佈局架構

1、項目文件結構和plist文件app

 

2、實現效果ide

3、代碼示例佈局

1.沒有使用配套的類,而是直接使用xib文件控件tag值操做優化

數據模型部分:atom

YYtg.h文件spa

複製代碼
 1 //
 2 //  YYtg.h
 3 //  01-團購數據顯示(沒有配套的類)
 4 //
 5 //  Created by apple on 14-5-29.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 #import "Global.h"
11 
12 @interface YYtg : NSObject
13 @property(nonatomic,copy)NSString *buyCount;
14 @property(nonatomic,copy)NSString *icon;
15 @property(nonatomic,copy)NSString *price;
16 @property(nonatomic,copy)NSString *title;
17 YYinitH(tg)
18 @end
複製代碼

YYtg.m文件code

複製代碼
 1 //
 2 //  YYtg.m
 3 //  01-團購數據顯示(沒有配套的類)
 4 //
 5 //  Created by apple on 14-5-29.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYtg.h"
10 
11 @implementation YYtg
12 YYinitM(tg)
13 @end
複製代碼

主控制器orm

YYViewController.m文件blog

複製代碼
 1 //
 2 //  YYViewController.m
 3 //  01-團購數據顯示(沒有配套的類)
 4 //
 5 //  Created by apple on 14-5-29.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYViewController.h"
10 #import "YYtg.h"
11 
12 @interface YYViewController ()<UITableViewDataSource>
13 @property(nonatomic,strong)NSArray *tg;
14 @property (strong, nonatomic) IBOutlet UITableView *tableview;
15 
16 @end
17 
18 @implementation YYViewController
19 
20 - (void)viewDidLoad
21 {
22     [super viewDidLoad];
23     self.tableview.rowHeight=100;
24     
25 }
26 
27 #pragma mark-  懶加載
28 -(NSArray *)tg
29 {
30     if (_tg==nil) {
31         NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil];
32         NSArray *temparray=[NSArray arrayWithContentsOfFile:fullpath];
33         
34         NSMutableArray *arrayM=[NSMutableArray arrayWithCapacity:temparray.count];
35         for (NSDictionary *dict in temparray) {
36             YYtg *tg=[YYtg tgWithDict:dict];
37             [arrayM addObject:tg];
38         }
39         _tg=[arrayM mutableCopy];
40     }
41     return _tg;
42 }
43 
44 #pragma mark-數據顯示
45 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
46 {
47     return 1;
48 }
49 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
50 {
51     return self.tg.count;
52 }
53 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
54 {
55     //讀取xib中的數據
56 //    NSArray *arrayM=[[NSBundle mainBundle]loadNibNamed:@"tgcell" owner:nil options:nil];
57 //    UITableViewCell *cell=[arrayM firstObject];
58     static NSString *identifier=@"tg";
59     UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
60     if (cell==nil) {
61        // cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
62         cell= [[[NSBundle mainBundle]loadNibNamed:@"tgcell" owner:nil options:nil] firstObject];
63     }
64     
65     YYtg *tg=self.tg[indexPath.row];
66     //設置數據
67     //使用tag
68     UIImageView *imgv=(UIImageView *)[cell viewWithTag:1];
69     imgv.image=[UIImage imageNamed:tg.icon];
70     UILabel *buyCount=(UILabel *)[cell viewWithTag:4];
71     buyCount.text=[NSString stringWithFormat:@"已有%@人購買",tg.buyCount];
72     UILabel *title=(UILabel *)[cell viewWithTag:2];
73     title.text=tg.title;
74     UILabel *price=(UILabel *)[cell viewWithTag:3];
75     price.text=[NSString stringWithFormat:@"$%@",tg.price];
76     
77     
78     //返回cell
79     return cell;
80 }
81 
82 //隱藏狀態欄
83 -(BOOL)prefersStatusBarHidden
84 {
85     return YES;
86 }
87 @end
複製代碼

使用xib自定義的UItableviewcell

代碼分析:

上面的代碼經過使用xib文件中各個控件的tag值,完成對每一個部分數據的賦值和刷新。可是,做爲主控制器,它應該知道xib文件中各個控件的tag值,它知道的是否是太多了呢?

爲了解決上面的問題,咱們能夠爲自定義的cell設置一個配套的類,讓這個類來操做這個xib,對外提供接口,至於內部的數據處理,外界不須要關心,也不用關心。

改造後的代碼以下:

 

2.使用xib和對應的類完成自定義cell的數據展現

新建一個類,用來管理對應的xib文件

注意類的繼承類,並把該類和xib文件進行關聯

YYtgcell.h文件代碼:

複製代碼
 1 //
 2 //  YYtgcell.h
 3 //  02-團購(使用xib和類完成數據展現)
 4 //
 5 //  Created by apple on 14-5-29.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import <UIKit/UIKit.h>
10 #import "YYtg.h"
11 
12 @interface YYtgcell : UITableViewCell
13 @property(nonatomic,strong)YYtg *yytg;
14 
15 @end
複製代碼

 YYtgcell.m文件

複製代碼
 1 //
 2 //  YYtgcell.m
 3 //  02-團購(使用xib和類完成數據展現)
 4 //
 5 //  Created by apple on 14-5-29.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYtgcell.h"
10 //私有擴展
11 @interface YYtgcell()
12 @property (strong, nonatomic) IBOutlet UIImageView *img;
13 @property (strong, nonatomic) IBOutlet UILabel *titlelab;
14 @property (strong, nonatomic) IBOutlet UILabel *pricelab;
15 @property (strong, nonatomic) IBOutlet UILabel *buycountlab;
16 @end
17 @implementation YYtgcell
18 
19 #pragma mark 重寫set方法,完成數據的賦值操做
20 -(void)setYytg:(YYtg *)yytg
21 {
22     _yytg=yytg;
23     self.img.image=[UIImage imageNamed:yytg.icon];
24     self.titlelab.text=yytg.title;
25     self.pricelab.text=[NSString stringWithFormat:@"$%@",yytg.price];
26     self.buycountlab.text=[NSString stringWithFormat:@"已有%@人購買",yytg.buyCount];
27 }
28 @end
複製代碼

主控制器

YYViewController.m文件

複製代碼
 1 //
 2 //  YYViewController.m
 3 //  02-團購(使用xib和類完成數據展現)
 4 //
 5 //  Created by apple on 14-5-29.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYViewController.h"
10 #import "YYtg.h"
11 #import "YYtgcell.h"
12 
13 @interface YYViewController ()<UITableViewDataSource,UITableViewDelegate>
14 @property (strong, nonatomic) IBOutlet UITableView *tableview;
15 
16 @property(strong,nonatomic)NSArray *tg;
17 @end
18 
19 @implementation YYViewController
20 
21 - (void)viewDidLoad
22 {
23     [super viewDidLoad];
24     self.tableview.rowHeight=80.f;
25 }
26 #pragma mark-  懶加載
27 -(NSArray *)tg
28 {
29     if (_tg==nil) {
30         NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil];
31         NSArray *temparray=[NSArray arrayWithContentsOfFile:fullpath];
32         
33         NSMutableArray *arrayM=[NSMutableArray arrayWithCapacity:temparray.count];
34         for (NSDictionary *dict in temparray) {
35             YYtg *tg=[YYtg tgWithDict:dict];
36             [arrayM addObject:tg];
37         }
38         _tg=[arrayM mutableCopy];
39     }
40     return _tg;
41 }
42 
43 
44 #pragma mark- xib建立cell數據處理
45 #pragma mark 多少組
46 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
47 {
48     return 1;
49 }
50 #pragma mark多少行
51 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
52 {
53     return self.tg.count;
54 }
55 #pragma mark設置每組每行
56 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
57 {
58     static NSString *identifier= @"tg";
59     YYtgcell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
60     if (cell==nil) {
61         //如何讓建立的cell加個戳
62         //對於加載的xib文件,能夠到xib視圖的屬性選擇器中進行設置
63         cell=[[[NSBundle mainBundle]loadNibNamed:@"tgcell" owner:nil options:nil]firstObject];
64         NSLog(@"建立了一個cell");
65     }
66     
67     //設置cell的數據
68     //獲取當前行的模型
69     YYtg *tg=self.tg[indexPath.row];
70     cell.yytg=tg;
71     return cell;
72 }
73 
74 -(BOOL)prefersStatusBarHidden
75 {
76     return YES;
77 }
78 
79 @end
複製代碼

3.對上述代碼進行進一步的優化和調整(MVC)

優化以下:

(1)把主控制器中建立cell的過程抽取到YYtgcell中完成,並對外提供一個接口。

YYtgcell.h文件(提供接口)

複製代碼
1 #import <UIKit/UIKit.h>
2 #import "YYtgModel.h"
3 
4 @interface YYtgcell : UITableViewCell
5 @property(nonatomic,strong)YYtgModel *yytg;
6 
7 //把加載數據(使用xib建立cell的內部細節進行封裝)
8 +(instancetype)tgcellWithTableView:(UITableView *)tableView;
9 @end
複製代碼

YYtgcell.m文件(把建立自定義cell的部分進行封裝)

複製代碼
 1 //
 2 //  YYtgcell.m
 3 //  02-團購(使用xib和類完成數據展現)
 4 //
 5 //  Created by apple on 14-5-29.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYtgcell.h"
10 //私有擴展
11 @interface YYtgcell()
12 @property (strong, nonatomic) IBOutlet UIImageView *img;
13 @property (strong, nonatomic) IBOutlet UILabel *titlelab;
14 @property (strong, nonatomic) IBOutlet UILabel *pricelab;
15 @property (strong, nonatomic) IBOutlet UILabel *buycountlab;
16 @end
17 @implementation YYtgcell
18 
19 #pragma mark 重寫set方法,完成數據的賦值操做
20 -(void)setYytg:(YYtgModel *)yytg
21 {
22     _yytg=yytg;
23     self.img.image=[UIImage imageNamed:yytg.icon];
24     self.titlelab.text=yytg.title;
25     self.pricelab.text=[NSString stringWithFormat:@"$%@",yytg.price];
26     self.buycountlab.text=[NSString stringWithFormat:@"已有%@人購買",yytg.buyCount];
27 }
28 
29 +(instancetype)tgcellWithTableView:(UITableView *)tableView
30 {
31     static NSString *identifier= @"tg";
32     YYtgcell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
33     if (cell==nil) {
34         //如何讓建立的cell加個戳
35         //對於加載的xib文件,能夠到xib視圖的屬性選擇器中進行設置
36         cell=[[[NSBundle mainBundle]loadNibNamed:@"tgcell" owner:nil options:nil]firstObject];
37         NSLog(@"建立了一個cell");
38     }
39     return cell;
40 }
41 
42 @end
複製代碼

主控器中的業務邏輯更加清晰,YYViewController.m文件代碼以下

複製代碼
 1 //
 2 //  YYViewController.m
 3 //  02-團購(使用xib和類完成數據展現)
 4 //
 5 //  Created by apple on 14-5-29.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYViewController.h"
10 #import "YYtgModel.h"
11 #import "YYtgcell.h"
12 
13 @interface YYViewController ()<UITableViewDataSource,UITableViewDelegate>
14 @property (strong, nonatomic) IBOutlet UITableView *tableview;
15 
16 @property(strong,nonatomic)NSArray *tg;
17 @end
18 
19 @implementation YYViewController
20 
21 - (void)viewDidLoad
22 {
23     [super viewDidLoad];
24     self.tableview.rowHeight=80.f;
25 }
26 #pragma mark-  懶加載
27 -(NSArray *)tg
28 {
29     if (_tg==nil) {
30         NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil];
31         NSArray *temparray=[NSArray arrayWithContentsOfFile:fullpath];
32         
33         NSMutableArray *arrayM=[NSMutableArray arrayWithCapacity:temparray.count];
34         for (NSDictionary *dict in temparray) {
35             YYtgModel *tg=[YYtgModel tgWithDict:dict];
36             [arrayM addObject:tg];
37         }
38         _tg=[arrayM mutableCopy];
39     }
40     return _tg;
41 }
42 
43 
44 #pragma mark- xib建立cell數據處理
45 
46 #pragma mark 多少組
47 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
48 {
49     return 1;
50 }
51 
52 #pragma mark多少行
53 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
54 {
55     return self.tg.count;
56 }
57 
58 #pragma mark設置每組每行
59 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
60 {
61     //1.建立cell
62     YYtgcell *cell=[YYtgcell tgcellWithTableView:tableView];
63    
64     //2.獲取當前行的模型,設置cell的數據
65     YYtgModel *tg=self.tg[indexPath.row];
66     cell.yytg=tg;
67     
68     //3.返回cell
69     return cell;
70 }
71 
72 #pragma mark- 隱藏狀態欄
73 -(BOOL)prefersStatusBarHidden
74 {
75     return YES;
76 }
77 
78 @end
複製代碼

4、推薦調整的項目文件結構

這是調整後的文件結構,完整的MVC架構。

注意:注意文件的命名規範。

提示技巧:批量更名,操做以下:

 

修改成想要的名稱:

相關文章
相關標籤/搜索