標籤:
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自訂儲存格