添加自定義表視圖單元有兩種方法:一種方法是創建單元時在程序中添加子視圖,第二種方法是從分鏡或者nib文件中加載它們,在這裡我們簡單采用第二種方法
一般來說,ios數據列表包含了兩部分:表視圖(分組表和無格式表)和表視圖單元。每個表視圖都是UITableView類的一個實例,用於顯示表數據的視圖對象;而每個可見行都是UITableViewCell類的一個實例,顯示表中的一行。如下圖所示:
表視圖單元包含了三種樣式:圖像,文本標簽和詳細文本標簽。而對於某種業務的要求(如上圖右上要顯示標簽文字,右下顯示圖像),默認的單元樣式不能滿足,此時我們可以對表視圖單元進行自定義顯示。
添加自定義表視圖單元有兩種方法:一種方法是創建單元時在程序中添加子視圖,第二種方法是從分鏡或者nib文件中加載它們,在這裡我們簡單采用第二種方法,效果圖如下:
在開始之前,咱們有必要知道UITableView的兩個協議:UITableViewDelegate和UITableViewDataSource。表視圖從遵循UITableViewDelegate協議的對象中獲取配置數據,從遵循UITableViewDataSource協議的對象中獲得行數據。
1、 創建CustomCellTableView工程,選擇Single View Application。
2、 創建UITableViewCell的子類CustomCell
選擇File->New->File,然後選擇Cocoa Touch Class。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="2" src="/uploadfile/Collfiles/20160406/20160406092645125.png" title="\" />
輸入“CustomCell”,繼承於UITableViewCell,勾選“Also create XIB file” ,按Next直至成功。
3、 創建表視圖單元數據文件CustomCellData。
選擇File->New->File,先選擇Objective-C File創建CustomCellData.m文件,然後再選擇Header File創建CustomCellData.h文件。
在這裡,因為表視圖單元的數據是通過CustomCellData來存儲,顯示視圖是通過CustomCell,所以文件組織形式還是采用數據(model)和表視圖單元視圖(View)分開。創建一個CustomCell Group文件夾,然後再分別創建View文件夾和Model文件夾,用以分別歸納CustomCell和CustomCellData文件。如下圖所示。
4、 用界面構建器可視化布局CustomCell.xib,設定約束,界面如下圖所示。
Identifier設為CustomCell。
Custom Class要確定為CustomCell。
按住Controll鍵,將輸出接口關聯至相關的標簽。
5、 打開主分鏡main storyboard,連接tableview到ViewController.m
點擊ViewController,確保Custom Class為ViewController。
點擊TableView,按住control鍵連接輸出變量到View Controller。
這裡tableview的委托(delegate)有兩種設置方法,第一種是nib文件中設置,按住controll鍵,分別把dataSource和delegate拉到tableview中;第二種是在代碼中設置,打開ViewController.m,在viewDidLoad中輸入以下代碼:
self.tableView.dataSource = self;
self.tableView.delegate = self;
6、 導入圖片。
直接拖拉圖片文件password.png到項目導航欄中,如下圖所示。
7、 輸入核心代碼。
CustomCellData.m:用以保存表視圖單元格中要顯示對象的數據。
#import "CustomCellData.h"
@implementation CustomCellData
+ (instancetype)cellWithInfo:(NSString *)mainTitle
subTitle:(NSString *)subTitle
leftImage:(NSString *)leftImage
rightImage:(NSString *)rightImage
time:(NSString *)time{
CustomCellData *item = [[self alloc] init];
item.mainTitle = mainTitle;
item.subTitle = subTitle;
item.leftImage = leftImage;
item.rightImage = rightImage;
item.time = time;
return item;
}
@end
CustomCell:表視圖單元,繼承自UITableViewCell,表格中顯示的每一行。
#import "CustomCell.h"
@implementation CustomCell
/*
可重用cell單元
*/
+ (instancetype)cellWithTableView:(UITableView *)tableView {
static NSString *ID = @"CustomCell";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[[NSBundle mainBundle]loadNibNamed:[[self class] description] owner:nil options:nil]lastObject];
}
return cell;
}
- (void)setItemData:(CustomCellData *)itemData{
_itemData = itemData;
[self setupData];
}
- (void)setupData{
self.leftImage.image = (_itemData.leftImage == nil ? nil : [UIImage imageNamed:_itemData.leftImage]);
self.rightImage.image = (_itemData.rightImage == nil ? nil : [UIImage imageNamed:_itemData.rightImage]);
self.mainTitle.text = _itemData.mainTitle;
self.mainTitle.font = [UIFont fontWithName:@"Helvetica" size:15.f];
self.SubTitle.textColor = [UIColor colorWithRed:((float)((0x800000 & 0xFF0000) >> 16))/255.0
green:((float)((0x008A00 & 0xFF00) >> 8))/255.0
blue:((float)(0x000087 & 0xFF))/255.0 alpha:1.0];
self.SubTitle.text = _itemData.subTitle;
self.SubTitle.font = [UIFont fontWithName:@"Helvetica" size:9.f];
self.timeLabel.text = _itemData.time;
self.timeLabel.font = [UIFont fontWithName:@"Helvetica" size:9.f];
}
@end
ViewController.h:實現UITableView協議。
@interface ViewController : UIViewController
ViewController.m:實現UITableViewDataSource和UITableViewDelegate協議方法,並在cellForRowAtIndexPath協議方法中調用自定義CustomCell。記得在ViewController.h中添加協議。
#pragma mark UITableViewDataSource
/**
* 每行表視圖單元格顯示的內容數據設置
*/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
CustomCell *cell = nil;
CustomCellData *itemData = nil;
if (0 == indexPath.section) {
itemData = self.dataArray[indexPath.row];
}else if (1 == indexPath.section) {
itemData = self.saleDataArray[indexPath.row];
}
cell = [CustomCell cellWithTableView:tableView];
cell.itemData = itemData;
return cell;
}
- (void)setupData{
NSDate *dateNow = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat : @"H:m"];
NSString *time = [formatter stringFromDate:dateNow];
[self.dataArray addObject:[CustomCellData cellWithInfo:@"文件傳輸助手"
subTitle:@"想傳什麼盡管傳"
leftImage:@"ic_sale_re"
rightImage:@"password"
time:time]];
[self.dataArray addObject:[CustomCellData cellWithInfo:@"通訊錄"
subTitle:@"你的專屬通訊錄"
leftImage:@"ic_sale_re"
rightImage:@"password"
time:time]];
[self.dataArray addObject:[CustomCellData cellWithInfo:@"訂閱號"
subTitle:@"人人都是產品經理"
leftImage:@"ic_sale_re"
rightImage:@"password"
time:time]];
[self.saleDataArray addObject:[CustomCellData cellWithInfo:@"李雷"
subTitle:@"北京大學附屬中學"
leftImage:@"ic_sale_re"
rightImage:@"password"
time:time]];
[self.saleDataArray addObject:[CustomCellData cellWithInfo:@"韓梅梅"
subTitle:@"北京大學附屬中學"
leftImage:@"ic_sale_re"
rightImage:@"password"
time:time]];
}
運行程序,OK成功。詳情代碼請參考 自定義表視圖單元。