首页 > 代码库 > 开发进阶18_通过xib自定义Cell

开发进阶18_通过xib自定义Cell

UITableViewController


继承自ViewController,TableViewController自动给我们添加了dataSource和delegate。
里面只有一个UITableView
 
1、UITableViewController内部默认会创建一个UITableView *tableView
2、UITableViewController内部tableView的delegate和dataSource就是这个UITableViewController
3、UITableViewController内部tableView就是控制器的view
  
设置Cell高度
 
1、如果每一行的高度一样,那么就可以在viewDidLoad方法中使用
self.tableView.rowHeight = 80;
2、如果每一行的高度不一样,那么需要使用代理方法进行高度的设置
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

      {

      }

 
需要设置xib文件的Identifier属性,设置为代码中设置的循环标记一致
 
加载xib文件的两种方式
 
    1、NewsCell是xib文件的名称
  NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"NewsCell" owner:nil options:nil];
 
    2、方法二

   UINib *nib = [UINib nibWithNibName:@"NewsCell" bundle:nil];

   NSArray *objects = [nib instantiateWithOwner:nil options:nil];

当bundle当参数传递的时候,传递nil和[NSBundle mainBundle];效果是一样的,默认访问的就是main bundle
 
通过xib自定义cell
-》一定要注意在xib的cell重设置重用标识(reuse identifier)
 
-》封装步骤:
1、新建xib描述cell的样子—DealCell.xib
2、新建UITableViewCell的子类 —DealCell(封装xib内部的所有东西)
3、修改xib中cell的类名(class)为DealCell
4、在DealCell中拥有xib中的所有子控件(声明属性、进行连线)
5、新建模型Deal,封装数据
6、给DealCell增加模型属性
@property (nonatomic,strong)Deal  *deal;
7、重写setDeal方法:在这个方法中根据模型数据设置cell内部子控件的属性
8、DealCell提供一个类方法,返回从xib重创建好的cell对象
9、给xib中的cell添加一个重用标识(比如deal),提供一个类方法,返回重用标识
10、提供一个类方法,返回cell的高度
 
-》使用cell
1、利用重用标识去缓存池取得cell
2、如果缓存池没有cell,创建cell
3、传递模型给cell
4、在viewDidLoad方法中设置每一行的高度,或者使用
 
在viewDidLoad方法中需要完成的事情:
-》设置高度
-》完成数组的初始化
  
正是因为NewCell文件重写了模型数据的set方法(在方法内部将传递过去的模型数据赋值给xib文件中控件对应的属性),才能在界面上显示不同的数据
 
NewsCellController文件

@interface NewsCellController ()

{

    NSMutableArray *_allNews;

}

@end

@implementation NewsCellController

- (void)viewDidLoad {

    [super viewDidLoad];

    self.tableView.rowHeight = [NewCell rowHeight]; 

    //从plist文件中取出数据

    NSArray *arr = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"news.plist" ofType:nil]];

    _allNews = [NSMutableArray array];

    for (NSMutableArray *dict in arr){

        [_allNews addObject:[NewsModel newsWithDict:dict]];

    }

}

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return _allNews.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    NewCell *cell = [tableView dequeueReusableCellWithIdentifier:[NewCell ID]];

    if(cell == nil){

        cell = [NewCell newCell];

    }

    //传递数据模型

    cell.newsModel = _allNews[indexPath.row];

    return cell;

}

@end

NewCell文件

#import "NewCell.h"

#import "NewsModel.h"

@implementation NewCell

+ (CGFloat)rowHeight

{

    return 80;

+ (NSString *)ID

{

    return @"cell";

}

+ (id)newCell

{

    return [[NSBundle mainBundle] loadNibNamed:@"NewCell" owner:nil options:nil][0];

}

- (void)setNewsModel:(NewsModel *)newsModel

{

    _newsModel = newsModel;

    _titleLabel.text = newsModel.title;

    _authorLabel.text = [NSString stringWithFormat:@"作者:%@", newsModel.author];

    _commentsLabel.text = [NSString stringWithFormat:@"评论:%d",newsModel.comments];

    _cellView.image = [UIImage imageNamed:newsModel.cellView];

}

@end

 
NewsModel文件
 

@interface NewsModel : NSObject

 

@property (nonatomic, copy) NSString *title;

@property (nonatomic, copy) NSString *author;

@property (nonatomic, assign) int comments;

@property (nonatomic, copy) NSString *cellView;

 

+ (id)newsWithDict:(NSDictionary *)dict;

- (id)initWithDict:(NSDictionary *)dict;

@end

 

@implementation NewsModel

 

+ (id)newsWithDict:(NSDictionary *)dict

{

    return [[self alloc] initWithDict:dict];

}

 

- (id)initWithDict:(NSDictionary *)dict

{

    if(self = [super init]){

        self.title = dict[@"title"];

        self.author = dict[@"author"];

        self.cellView = dict[@"icon"];

        self.comments = [dict[@"comments"] intValue];

    }

    

    return self;

}

@end

开发进阶18_通过xib自定义Cell