您好,登录后才能下订单哦!
自定义单元格:三种方法
方法一:向contentView添加子视图
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
//内容下移64px
tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
tableView.dataSource = self;
tableView.delegate = self;
//获取数据
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Films" ofType:@"plist"];
self.dataArray = [[NSArray alloc] initWithContentsOfFile:filePath];
[self.view addSubview:tableView];
}
#pragma Mark -UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *dic = [self.dataArray objectAtIndex:indexPath.row];
NSString *identifier = @"MyCell";
UITableViewCell *tableVC = [tableView dequeueReusableCellWithIdentifier:identifier];
if (tableVC == nil) {
tableVC = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
//注意:控件的创建应该跟在tableVC的初始化放在一起,确保tableVC当中只有自己创建的这一个控件,不会出现空间的叠加(共有)
//添加图片
UIImageView *p_w_picpathView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 10, 150, 180)];
p_w_picpathView.tag = 100;
[tableVC.contentView addSubview:p_w_picpathView];
//添加电影名称
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(190, 10, 200, 40)];
titleLabel.tag = 101;
titleLabel.font = [UIFont boldSystemFontOfSize:16];
titleLabel.textColor = [UIColor blueColor];
[tableVC.contentView addSubview:titleLabel];
//添加电影评分
UILabel *ratingLabel = [[UILabel alloc] initWithFrame:CGRectMake(190, 60, 100, 40)];
ratingLabel.tag = 102;
ratingLabel.font = [UIFont boldSystemFontOfSize:14];
ratingLabel.textColor = [UIColor cyanColor];
[tableVC.contentView addSubview:ratingLabel];
//添加电影的年份
UILabel *yearLabel = [[UILabel alloc] initWithFrame:CGRectMake(190, 110, 100, 20)];
yearLabel.tag = 103;
yearLabel.font = [UIFont boldSystemFontOfSize:12];
yearLabel.textColor = [UIColor orangeColor];
[tableVC.contentView addSubview:yearLabel];
}
//对控件赋值应该放在外面(特有)
//图片
UIImageView *p_w_picpathView = (UIImageView *)[tableVC.contentView viewWithTag:100];
p_w_picpathView.p_w_picpath = [UIImage p_w_picpathNamed:[dic objectForKey:@"p_w_picpath"]];
//名字
UILabel *titleLabel = (UILabel *)[tableVC.contentView viewWithTag:101];
titleLabel.text = [NSString stringWithFormat:@"电影:%@",[dic objectForKey:@"title"]];
//评分
UILabel *ratingLabel = (UILabel *)[tableVC.contentView viewWithTag:102];
ratingLabel.text = [NSString stringWithFormat:@"评分:%@",[dic objectForKey:@"rating"]];
//年份
UILabel *yearLabel = (UILabel *)[tableVC.contentView viewWithTag:103];
yearLabel.text = [NSString stringWithFormat:@"年份:%@",[dic objectForKey:@"year"]];
return tableVC;
}
#pragma Mark -UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 200;
}
@end
方法二:先创建一个xib文件---(然后在xib上拖一个tableCell并设置大小---(在tableCell上拖需要的控件并设置控件的属性和tag值-----(将xib文件中tableCell的identifier该为设置的identifier
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
tableView.delegate =self;
tableView.dataSource = self;
[self.view addSubview:tableView];
//定制单元格的高度
tableView.rowHeight = 200;
//获取数据源
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Films" ofType:@"plist"];
self.dataArray = [NSArray arrayWithContentsOfFile:filePath];
}
#pragma mark -UITableViewDataSource
#pragma mark -UITableViewDelegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *identifier = @"MyCell";
UITableViewCell *tableVC = [tableView dequeueReusableCellWithIdentifier:identifier];
if (tableVC == nil) {
tableVC =[[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil]lastObject];
}
NSDictionary *dic = self.dataArray[indexPath.row];
//图片
UIImageView *p_w_picpathView = (UIImageView *)[tableVC.contentView viewWithTag:100];
p_w_picpathView.p_w_picpath = [UIImage p_w_picpathNamed:[dic objectForKey:@"p_w_picpath"]];
//电影名
UILabel *titleLabel = (UILabel *)[tableVC.contentView viewWithTag:101];
titleLabel.text = [NSString stringWithFormat:@"电影:%@",[dic objectForKey:@"title"]];
//评分
UILabel *ratingLabel = (UILabel *)[tableVC.contentView viewWithTag:102];
ratingLabel.text = [NSString stringWithFormat:@"评分:%@",[dic objectForKey:@"rating"]];
//年份
UILabel *yearLabel = (UILabel *)[tableVC.contentView viewWithTag:103];
yearLabel.text = [NSString stringWithFormat:@"年份:%@",[dic objectForKey:@"year"]];
return tableVC;
}
@end
方法三:
(1)方法一:在storyboard文件中拖一个tableView,然后再拖一个tableCell并设置大小---(在tableCell上拖需要的控件并设置控件的属性-----(建立一个类继承于UITableViewCell,将各个控件在此文件中声明并声明一个字典(根据情况而定)接收ViewContoller中值-------(将storyboard文件中tableCell的identifier该为设置的identifier,并继承于新建的文件。
主要代码写在声明的字典的set方法中。
#import "ViewController.h"
#import "MovieTableViewCell.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Films" ofType:@"plist"];
self.dataArray = [NSArray arrayWithContentsOfFile:filePath];
}
#pragma mark -UITableViewDelegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//V(View)
MovieTableViewCell *tableVC = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath];
//在控制器中,不应该设置太多视图自己需要显示的内容,控制器充当MVC架构模式中的C,需要做的应该啊hi把M------->V
//M(Model)
NSDictionary *dic = self.dataArray[indexPath.row];
//dic-------->Cell
tableVC.dataDic = dic;
return tableVC;
}
@end
#import "MovieTableViewCell.h"
@implementation MovieTableViewCell
//当视图从xib文件或者storyboard中加载时,走这个方法,相当于初始化方法
- (void)awakeFromNib {
// Initialization code
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
-(void)setDataDic:(NSDictionary *)dataDic
{
if (_dataDic != dataDic) {
_dataDic = dataDic;
//此时确保值能传过来
self.imgView.p_w_picpath = [UIImage p_w_picpathNamed:[self.dataDic objectForKey:@"p_w_picpath"]];
self.titleLabel.text = [NSString stringWithFormat:@"电影:%@",[self.dataDic objectForKey:@"title"]];
self.ratingLabel.text = [NSString stringWithFormat:@"评分:%@",[self.dataDic objectForKey:@"rating"]];
self.yearLabel.text = [NSString stringWithFormat:@"年份:%@",[self.dataDic objectForKey:@"year"]];
}
}
@end
(2)(此方法比较常用)方法二:建立一个类继承于UITableViewCell和创建一个类MoviewModel继承与NSObject-------(将各个控件在继承于UITableViewCell文件中创建并声明一个MovieModel接收-----(在ViewContoller文件中创建MovieModel,接收值。
#import "ViewController.h"
#import "MovieTableViewCell.h"
#import "MovieModel.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
tableView.delegate =self;
tableView.dataSource = self;
[self.view addSubview:tableView];
tableView.rowHeight = 200;
//获取数据源
// NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Films" ofType:@"plist"];
// self.dataArray = [NSArray arrayWithContentsOfFile:filePath];
//由原来的dataDic改为装movieModel
NSArray *dataArr = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Films" ofType:@"plist"]];
NSMutableArray *mArray = [NSMutableArray array];
for (NSDictionary *dic in dataArr) {
NSString *title = [dic objectForKey:@"title"];
NSString *p_w_picpathName = [dic objectForKey:@"p_w_picpath"];
NSString *rating = [dic objectForKey:@"rating"];
NSString *year = [dic objectForKey:@"year"];
//将数据填充到movieModel
MovieModel *model = [[MovieModel alloc] init];
model.title = title;
model.p_w_picpathName = p_w_picpathName;
model.ratingLabel = rating;
model.yearLabel = year;
[mArray addObject:model];
}
self.dataArray = mArray;
}
#pragma mark -UITableViewDelegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *identifier = @"MyCell";
MovieTableViewCell *tableVC = [tableView dequeueReusableCellWithIdentifier:identifier];
if (tableVC == nil) {
tableVC = [[MovieTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
// NSDictionary *dic = self.dataArray[indexPath.row];
// tableVC.dataDic = dic;
tableVC.movieModel = self.dataArray[indexPath.row];
return tableVC;
}
@end
#import "MovieTableViewCell.h"
@implementation MovieTableViewCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self != nil) {
//........
[self initViews];
}
return self;
}
- (void)awakeFromNib {
// Initialization code
[super awakeFromNib];
[self initViews];
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
//- (void)setDataDic:(NSDictionary *)dataDic
//{
// if (_dataDic != dataDic) {
// _dataDic = dataDic;
// //手动调动layoutSubviews
// [self setNeedsLayout];
// }
//}
//初始化自身的子视图
- (void)initViews
{
//添加图片
UIImageView *p_w_picpathView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 10, 150, 180)];
p_w_picpathView.tag = 100;
[self.contentView addSubview:p_w_picpathView];
//添加电影名称
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(190, 10, 200, 40)];
titleLabel.tag = 101;
titleLabel.font = [UIFont boldSystemFontOfSize:16];
titleLabel.textColor = [UIColor blueColor];
[self.contentView addSubview:titleLabel];
//添加电影评分
UILabel *ratingLabel = [[UILabel alloc] initWithFrame:CGRectMake(190, 60, 100, 40)];
ratingLabel.tag = 102;
ratingLabel.font = [UIFont boldSystemFontOfSize:14];
ratingLabel.textColor = [UIColor cyanColor];
[self.contentView addSubview:ratingLabel];
//添加电影的年份
UILabel *yearLabel = [[UILabel alloc] initWithFrame:CGRectMake(190, 110, 100, 20)];
yearLabel.tag = 103;
yearLabel.font = [UIFont boldSystemFontOfSize:12];
yearLabel.textColor = [UIColor orangeColor];
[self.contentView addSubview:yearLabel];
}
-(void)setMovieModel:(MovieModel *)movieModel
{
if (_movieModel != movieModel) {
_movieModel = movieModel;
[self setNeedsLayout];
}
}
//当子视图重新布局时需要调用的方法
- (void)layoutSubviews
{
//一定注意(不可缺少)
[super layoutSubviews];
//图片
UIImageView *p_w_picpathView = (UIImageView *)[self.contentView viewWithTag:100];
// p_w_picpathView.p_w_picpath = [UIImage p_w_picpathNamed:[self.dataDic objectForKey:@"p_w_picpath"]];
p_w_picpathView.p_w_picpath = [UIImage p_w_picpathNamed:self.movieModel.p_w_picpathName];
//名字
UILabel *titleLabel = (UILabel *)[self.contentView viewWithTag:101];
// titleLabel.text = [NSString stringWithFormat:@"电影:%@",[self.dataDic objectForKey:@"title"]];
titleLabel.text = [NSString stringWithFormat:@"电影:%@",self.movieModel.title];
//评分
UILabel *ratingLabel = (UILabel *)[self.contentView viewWithTag:102];
// ratingLabel.text = [NSString stringWithFormat:@"评分:%@",[self.dataDic objectForKey:@"rating"]];
ratingLabel.text = [NSString stringWithFormat:@"评分:%@",self.movieModel.ratingLabel];
//年份
UILabel *yearLabel = (UILabel *)[self.contentView viewWithTag:103];
// yearLabel.text = [NSString stringWithFormat:@"年份:%@",[self.dataDic objectForKey:@"year"]];
yearLabel.text = [NSString stringWithFormat:@"年份:%@",self.movieModel.yearLabel];
}
@end
MovieModel.h文件
#import <Foundation/Foundation.h>
@interface MovieModel : NSObject
@property (nonatomic,copy)NSString *p_w_picpathName;
@property (nonatomic,copy)NSString *title;
@property (nonatomic,copy)NSString *rating;
@property (nonatomic,copy)NSString *year;
@end
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。