iOS:UITableViewCell自訂儲存格

來源:互聯網
上載者:User

標籤:

UITableViewCell:自訂的儲存格,可以在xib中建立儲存格,也可以在storyBorad中建立儲存格。有四種建立方式

<1>在storyBorad中建立的儲存格,它是靜態儲存格,儲存格一開始就存在,可以直接根據自訂的重用標識名載入使用;<2>當然,storyBorad中儲存格也可以關聯一個自訂的類,這個類必須是繼承UITableViewCell,這種情況下,直接根據自訂的重用標識名載入使用也是可以的。<3>在xib中建立的儲存格,如果直接通過bundel的loadNibNme的方法載入,也可以直接根據重用標識符載入使用;<4>當然,xib檔案中的儲存格可以關聯一個自訂的類,這個類必須是繼承UITableViewCell,這種情況下,如果直接根據自訂的重用標識符載入使用是行不通的,因為此時代理的方法沒有對儲存格對象進行初始化,此時,需要對建立儲存格對象的過程封裝到自己關聯的類中進行,即一個建立的儲存格的類方法用來載入xib檔案,一個類對象的執行個體方法,用來設定儲存格中屬性。     這是一個類似於連絡人表格的執行個體,有姓名和映像,以下四種方式都可以實現:   方法一:直接在storyBoard中建立儲存格並直接載入,自訂的儲存格位置一個UITableView的上面  需要設定儲存格的重用標識符identifier:代碼如下:   為初始化資料建立的一個類:
1 #import <Foundation/Foundation.h>2 3 @interface Contact : NSObject4 @property (copy,nonatomic)NSString *name;5 @property (copy,nonatomic)NSString *faceName;6 -(instancetype)initWithName:(NSString*)name andFaceName:(NSString*) faceName;7 @end
 1 #import "Contact.h" 2  3 @implementation Contact 4 -(instancetype)initWithName:(NSString*)name andFaceName:(NSString*) faceName 5 { 6     self = [super init]; 7     if(self) 8     { 9         _name = [name copy];10         _faceName = [faceName copy];11     }12     return self;13 }14 @end

  在視圖控制器中完成代碼:(需要用tag擷取儲存格的屬性控制項)

 1 #import "ViewController.h" 2 #import "Contact.h" 3 @interface ViewController ()<UITableViewDataSource> 4 @property (weak, nonatomic) IBOutlet UITableView *tableView; 5 @property (strong,nonatomic)NSMutableArray *contacts; 6 @end 7  8 @implementation ViewController 9 10 - (void)viewDidLoad {11     [super viewDidLoad];12     //初始化資料13     self.contacts = [NSMutableArray arrayWithCapacity:9];14     for(int i=0; i<9; i++)15     {16         Contact *conatct = [[Contact alloc]initWithName:[NSString stringWithFormat:@"name%d",i+1] andFaceName:[NSString stringWithFormat:@"%d.png",i]];17         [self.contacts addObject:conatct];18     }19     20     //設定tableView的資料來源21     self.tableView.dataSource = self;22 }23 24 #pragma mark -tableView的資料來源方法25 //每一組多少行26 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section27 {28     return self.contacts.count;29 }30 //設定每一個儲存格的內容31 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath32 {33     //1.根據reuseIdentifier,先到對象池中去找重用的儲存格對象34     static NSString *reuseIdentifier = @"myCell";35     UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];36     //2.設定儲存格對象的內容37     Contact *contact = [self.contacts objectAtIndex:indexPath.row];38     UILabel *label = (UILabel*)[cell viewWithTag:1];39     label.text = contact.name;40     UIImageView *imageView = (UIImageView*)[cell viewWithTag:2];41     [imageView setImage:[UIImage imageNamed:contact.faceName]];42     return cell;43 }44 45 @end

    方法二:直接在storyBoard中建立儲存格並關聯自訂的類並直接載入,自訂的儲存格位置一個UITableView的上面

   需要設定儲存格的重用標識符identifier    將儲存格與對應的自訂類關聯   代碼如下:為初始化建立的一個類:
#import <Foundation/Foundation.h>@interface Contact : NSObject@property (copy,nonatomic)NSString *name;@property (copy,nonatomic)NSString *faceName;-(instancetype)initWithName:(NSString*)name andFaceName:(NSString*) faceName;@end#import "Contact.h"@implementation Contact-(instancetype)initWithName:(NSString*)name andFaceName:(NSString*) faceName{    self = [super init];    if(self)    {        _name = [name copy];        _faceName = [faceName copy];    }    return self;}@end

  與儲存格關聯的自訂的類,關聯儲存格的屬性控制項(不需要再用tag擷取了,直接用self.擷取)

 

  還是在視圖控制器中完成載入:

 1 #import "ViewController.h" 2 #import "Contact.h" 3 #import "myTableViewCell.h" 4 @interface ViewController ()<UITableViewDataSource> 5 @property (weak, nonatomic) IBOutlet UITableView *tableView; 6 @property (strong,nonatomic)NSMutableArray *contacts; 7 @end 8  9 @implementation ViewController10 11 - (void)viewDidLoad {12     [super viewDidLoad];13     //初始化資料14     self.contacts = [NSMutableArray arrayWithCapacity:9];15     for(int i=0; i<9; i++)16     {17         Contact *conatct = [[Contact alloc]initWithName:[NSString stringWithFormat:@"name%d",i+1] andFaceName:[NSString stringWithFormat:@"%d.png",i]];18         [self.contacts addObject:conatct];19     }20     21     //設定tableView的資料來源22     self.tableView.dataSource = self;23 }24 25 #pragma mark -tableView的資料來源方法26 //每一組多少行27 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section28 {29     return self.contacts.count;30 }31 //設定每一個儲存格的內容32 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath33 {34     //1.根據reuseIdentifier,先到對象池中去找重用的儲存格對象35     static NSString *reuseIdentifier = @"myCell";36     myTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];37     //2.設定儲存格對象的內容38     Contact *contact = [self.contacts objectAtIndex:indexPath.row];39     cell.label.text = contact.name;40     [cell.imgView setImage:[UIImage imageNamed:contact.faceName]];41     return cell;42 }43 44 @end

   方法三:在xib檔案中建立儲存格,然後再視圖控制器中直接載入使用

  首先在storyBoard中添加一個UITableView

 

  然後在已經建立好的MyCell.xib中建立自訂的儲存格為:

    設定該儲存格的重用標識符identifier:

 

   建立一個連絡人初始化的類:

 1 #import <Foundation/Foundation.h> 2  3 @interface Contact : NSObject 4 @property (copy,nonatomic)NSString *name; 5 @property (copy,nonatomic)NSString *faceName; 6 -(instancetype)initWithName:(NSString*)name andFaceName:(NSString*) faceName; 7 @end 8  9 10 #import "Contact.h"11 12 @implementation Contact13 -(instancetype)initWithName:(NSString*)name andFaceName:(NSString*) faceName14 {15     self = [super init];16     if(self)17     {18         _name = [name copy];19         _faceName = [faceName copy];20     }21     return self;22 }23 @end

   還是在視圖控制器中完成載入:

 1 #import "ViewController.h" 2 #import "Contact.h" 3 #import "myTableViewCell.h" 4 @interface ViewController ()<UITableViewDataSource> 5 @property (weak, nonatomic) IBOutlet UITableView *tableView; 6 @property (strong,nonatomic)NSMutableArray *contacts; 7 @end 8  9 @implementation ViewController10 11 - (void)viewDidLoad {12     [super viewDidLoad];13     //初始化資料14     self.contacts = [NSMutableArray arrayWithCapacity:9];15     for(int i=0; i<9; i++)16     {17         Contact *conatct = [[Contact alloc]initWithName:[NSString stringWithFormat:@"name%d",i+1] andFaceName:[NSString stringWithFormat:@"%d.png",i]];18         [self.contacts addObject:conatct];19     }20     21     //設定tableView的資料來源22     self.tableView.dataSource = self;23 }24 25 #pragma mark -tableView的資料來源方法26 //每一組多少行27 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section28 {29     return self.contacts.count;30 }31 32 33 //直接從xib檔案中載入34 35 //設定每一個儲存格的內容36 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath37 {38     //1.根據reuseIdentifier,先到對象池中去找重用的儲存格對象39     static NSString *reuseIdentifier = @"myCell";40       UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];41     //2.如果沒找到,就自己建立cell42     if(!cell)43     {44         //從xib檔案中載入視圖45        NSArray *views = [[NSBundle mainBundle]loadNibNamed:@"MyCell" owner:nil options:nil];46         cell = (UITableViewCell*)[views lastObject];47     }48     //3.設定儲存格對象的內容49     Contact *contact = [self.contacts objectAtIndex:indexPath.row];50     UILabel *label = (UILabel*)[cell viewWithTag:1];51     label.text = contact.name;52     UIImageView *imgView = (UIImageView*)[cell viewWithTag:2];53     [imgView setImage:[UIImage imageNamed:contact.faceName]];54    55     return cell;56 }

  

  方法四:在xib檔案中建立儲存格,並建立與之關聯的的類,然後將載入過程封裝到它的類中協助初始化完成,同時該類提供類方法,最後再視圖控制器中通過這個類方法擷取儲存格。

  首先在storyBoard中添加一個UITableView

 

  然後在已經建立好的MyCell.xib中建立自訂的儲存格為:

 

  給儲存格設定重用標識符identifier

  將儲存格與自訂的類關聯

  建立一個連絡人初始化的類: 

 1#import <Foundation/Foundation.h> 2  3 @interface Contact : NSObject 4 @property (copy,nonatomic)NSString *name; 5 @property (copy,nonatomic)NSString *faceName; 6 -(instancetype)initWithName:(NSString*)name andFaceName:(NSString*) faceName; 7 @end 8  9 10 #import "Contact.h"11 12 @implementation Contact13 -(instancetype)initWithName:(NSString*)name andFaceName:(NSString*) faceName14 {15     self = [super init];16     if(self)17     {18         _name = [name copy];19         _faceName = [faceName copy];20     }21     return self;22 }23 @end

  建立一個與儲存格關聯的類:(將載入儲存格的過程和屬性封裝起來)

  在視圖控制器中通過上面的類方法擷取儲存格

 1 #import "ViewController.h" 2 #import "Contact.h" 3 #import "myTableViewCell.h" 4 @interface ViewController ()<UITableViewDataSource> 5 @property (weak, nonatomic) IBOutlet UITableView *tableView; 6 @property (strong,nonatomic)NSMutableArray *contacts; 7 @end 8  9 @implementation ViewController10 11 - (void)viewDidLoad {12     [super viewDidLoad];13     //初始化資料14     self.contacts = [NSMutableArray arrayWithCapacity:9];15     for(int i=0; i<9; i++)16     {17         Contact *conatct = [[Contact alloc]initWithName:[NSString stringWithFormat:@"name%d",i+1] andFaceName:[NSString stringWithFormat:@"%d.png",i]];18         [self.contacts addObject:conatct];19     }20     21     //設定tableView的資料來源22     self.tableView.dataSource = self;23 }24 25 #pragma mark -tableView的資料來源方法26 //每一組多少行27 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section28 {29     return self.contacts.count;30 }31 //在與xib關聯的類中載入xib檔案(其實就是封裝了一下而已)32 33 //設定每一個儲存格的內容34 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath35 {36     //1.根據reuseIdentifier,先到對象池中去找重用的儲存格對象37     static NSString *reuseIdentifier = @"myCell";38     myTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];39     //2.如果沒找到,就自己建立cell40     if(!cell)41     {42         cell = [myTableViewCell cell];//調用類方法43     }44     //3.設定儲存格對象的內容45     Contact *contact = [self.contacts objectAtIndex:indexPath.row];46     [cell setContact:contact];//調用執行個體方法47     48     return cell;49 }50 51 @end

 

iOS:UITableViewCell自訂儲存格

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.