iOS:UITableViewCell自定义单元格

简介:

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 : NSObject
4 @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)section
27 {
28     return self.contacts.count;
29 }
30 //设置每一个单元格的内容
31 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
32 {
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 ViewController
10 
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)section
28 {
29     return self.contacts.count;
30 }
31 //设置每一个单元格的内容
32 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
33 {
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 Contact
13 -(instancetype)initWithName:(NSString*)name andFaceName:(NSString*) faceName
14 {
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 ViewController
10 
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)section
28 {
29     return self.contacts.count;
30 }
31 
32 
33 //直接从xib文件中加载
34 
35 //设置每一个单元格的内容
36 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
37 {
38     //1.根据reuseIdentifier,先到对象池中去找重用的单元格对象
39     static NSString *reuseIdentifier = @"myCell";
40       UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
41     //2.如果没找到,就自己创建cell
42     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 Contact
13 -(instancetype)initWithName:(NSString*)name andFaceName:(NSString*) faceName
14 {
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 ViewController
10 
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)section
28 {
29     return self.contacts.count;
30 }
31 //在与xib关联的类中加载xib文件(其实就是封装了一下而已)
32 
33 //设置每一个单元格的内容
34 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
35 {
36     //1.根据reuseIdentifier,先到对象池中去找重用的单元格对象
37     static NSString *reuseIdentifier = @"myCell";
38     myTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
39     //2.如果没找到,就自己创建cell
40     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
复制代码

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!


本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4790600.html,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
iOS开发 UED
实现一个自定义的iOS动画效果
【4月更文挑战第9天】本文将详细介绍如何在iOS平台上实现一个自定义的动画效果。我们将通过使用Core Animation框架来实现这个动画效果,并展示如何在不同的场景中使用它。文章的目标是帮助读者理解如何使用Core Animation框架来创建自定义动画,并提供一个简单的示例代码。
52 1
|
16天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
31 1
|
25天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
47 5
|
1月前
|
Swift iOS开发 UED
实现一个自定义的iOS动画效果
本文介绍如何使用Swift和UIKit在iOS应用中实现一个自定义按钮动画,当按钮被点击时,其颜色从蓝色渐变为绿色,形状从圆形变为椭圆形,释放后恢复原状。通过UIView动画方法实现这一效果,代码示例展示了动画的平滑过渡和状态切换,有助于提升应用的视觉体验和用户交互。
49 1
|
2月前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
61 11
|
3月前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
51 7
|
6月前
|
iOS开发
iOS UITableViewCell刷新某些行的cell或section
iOS UITableViewCell刷新某些行的cell或section
75 0
|
iOS开发
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
470 0
|
API iOS开发
iOS 自定义转场动画 UIViewControllerTransitioning
iOS 自定义转场动画 UIViewControllerTransitioning
93 0
|
Swift iOS开发
iOS 13 之后自定义 Window 不显示解决 (SceneDelegate)
iOS 13 之后自定义 Window 不显示解决 (SceneDelegate)
361 0