• 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
  • 相关阅读:
    第02组 Alpha冲刺 (6/6)
    面向对象分析设计考试复习【历年卷】
    第02组 Alpha冲刺 (5/6)
    第02组 Alpha冲刺 (4/6)
    第02组 Alpha冲刺 (3/6)
    第02组 Alpha冲刺 (2/6)
    第02组 Alpha冲刺 (1/6)
    linux内核结构
    从别人的博客学习
    递归的认识
  • 原文地址:https://www.cnblogs.com/daxiong520/p/4915982.html
Copyright © 2020-2023  润新知