你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 【ios學習記錄】- 通過nib文件實現自定義表視圖單元

【ios學習記錄】- 通過nib文件實現自定義表視圖單元

編輯:IOS開發綜合

添加自定義表視圖單元有兩種方法:一種方法是創建單元時在程序中添加子視圖,第二種方法是從分鏡或者nib文件中加載它們,在這裡我們簡單采用第二種方法

一般來說,ios數據列表包含了兩部分:表視圖(分組表和無格式表)和表視圖單元。每個表視圖都是UITableView類的一個實例,用於顯示表數據的視圖對象;而每個可見行都是UITableViewCell類的一個實例,顯示表中的一行。如下圖所示:

 表視圖

表視圖單元

表視圖單元包含了三種樣式:圖像,文本標簽和詳細文本標簽。而對於某種業務的要求(如上圖右上要顯示標簽文字,右下顯示圖像),默認的單元樣式不能滿足,此時我們可以對表視圖單元進行自定義顯示。

添加自定義表視圖單元有兩種方法:一種方法是創建單元時在程序中添加子視圖,第二種方法是從分鏡或者nib文件中加載它們,在這裡我們簡單采用第二種方法,效果圖如下:

效果圖

在開始之前,咱們有必要知道UITableView的兩個協議:UITableViewDelegate和UITableViewDataSource。表視圖從遵循UITableViewDelegate協議的對象中獲取配置數據,從遵循UITableViewDataSource協議的對象中獲得行數據。

總體關系圖:

總體關系圖

主要流程:

1、 創建CustomCellTableView工程,選擇Single View Application。

1

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

3、 創建表視圖單元數據文件CustomCellData。

選擇File->New->File,先選擇Objective-C File創建CustomCellData.m文件,然後再選擇Header File創建CustomCellData.h文件。

4

5

在這裡,因為表視圖單元的數據是通過CustomCellData來存儲,顯示視圖是通過CustomCell,所以文件組織形式還是采用數據(model)和表視圖單元視圖(View)分開。創建一個CustomCell Group文件夾,然後再分別創建View文件夾和Model文件夾,用以分別歸納CustomCell和CustomCellData文件。如下圖所示。

6

4、 用界面構建器可視化布局CustomCell.xib,設定約束,界面如下圖所示。

7

Identifier設為CustomCell。

8

Custom Class要確定為CustomCell。

9

按住Controll鍵,將輸出接口關聯至相關的標簽。

10

5、 打開主分鏡main storyboard,連接tableview到ViewController.m

11

點擊ViewController,確保Custom Class為ViewController。

12

點擊TableView,按住control鍵連接輸出變量到View Controller。

13

14

這裡tableview的委托(delegate)有兩種設置方法,第一種是nib文件中設置,按住controll鍵,分別把dataSource和delegate拉到tableview中;第二種是在代碼中設置,打開ViewController.m,在viewDidLoad中輸入以下代碼:

self.tableView.dataSource = self;
self.tableView.delegate = self;

6、 導入圖片。

直接拖拉圖片文件password.png到項目導航欄中,如下圖所示。

15

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成功。詳情代碼請參考 自定義表視圖單元。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved