iOS开发-通过代码自定义cell

一、添加子控件和传递模型数据
注意:子控件位置不固定,不能写死时就用代码自定义cell
步骤一:将控制器改为继承UITableViewController,然后删除故事板上原来的View,新拖一个TableView,并将Class改为控制器
步骤二:新建一个类WeiboCell,继承自UITableViewCell
步骤三:在控制器实现文件中导入WeiboCell.h
第三个数据源方法
static NSString *ID = @“weibo”;

weiboCell *cell = [tableView dequeueReUsableCellWithIdentifier:ID];

if (cell == nil){
cell = [weiboCell alloc] initWithStyle:UITableCellStyleDefault reuseIdentifier:ID]; //创建的是weiboCell,所以取出来的也应该是这个。
}
return cell;
}
步骤四:在WeiboCell.m中
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier
{
self = [super initWithStyle reuseIdentifier:reuseIdentifier];
if (self){
// 添加内部的子控件(不管位置和宽高,把有可能用到的全部加进去)

//1.头像
_icon = [UIImageView alloc] init];
[self.contentView addSubview:_icon] ; //添加子控件要添加到contentView中
//2.昵称
_name = [UILabel alloc] init];
[self.contentView addSubview:_name];
//3.会员图标
_vip = [UIImageView alloc] initWithImage:[UIImage imageNamed:@"vip.png"]];
[self.contentView addSubview:_vip];
//4.时间
_time = [UILabel alloc] init];
[self.contentView addSubview:_time];
//5.来源
_source = [UILabel alloc] init];
[self.contentView addSubview:_source];
//6.微博正文
_content = [UILabel alloc] init];
_content.numberOfLines = 0; //自动换行
[self.contentView addSubview:_content];
//7.配图
_image = [UIImageView alloc] init];
[self.contentView addSubview:_image];

}

步骤五:开发模型并把模型传给cell
已准备好plist文件(Root为Array)
新建一个模型类Weibo,并声明7个属性。
并写2个方法用来把字典传进来变成模型
-(id)initWithDict:(NSDictionary *)dict
{
if (self = [super init]){
self.name = dict[@“name”];
self.time = dict[@“time”];
self.name = dict[@“name”];
self.name = dict[@“name”];
self.name = dict[@“name”];
self.name = dict[@“name”];
self.name = dict[@“name”];
}
}
+(id)weiboWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}
步骤六:在WeiboCell的头文件中传一个微博模型
@class weibo;
@property (nonatomic,strong)weibo weibo;

步骤七:在WeiboCell的实现文件中重写set方法,在这个方法将模型数据赋值给子控件
导入weibo.h
先在类扩展中将7个子控件声明为成员变量,然后将这些控件全部改为下划线
-(void)setWeibo:(weibo *)weibo
{
_weibo = weibo;

//1.头像
_icon.image = [UIImage imageNamed:weibo.icon];

//2.昵称
_name.text = weibo.name;
if (_weibo.vip){
_name.textColor = [UIColor yellowColor];
} else {
_name.textColor = [UIColor blackColor];
}

//3.会员图标
_vip.hidden = !weibo.vip;

//4.时间
_time.text = weibo.time;

//5.来源
_source.text = [NSString stringWithFormat:@"来自%@",_weibo.source];

//6.正文
_content.text = weibo.content;

//7.配图
if (weibo.image){ //有配图
_image.hidden = NO;

_image.image = [UIImage imageNamed:weibo.image];
} else { //没有配图
_image.hidden = YES;
}
}

步骤八:控制器加载plist文件(只需要加载一次,所以在viewDidLoad中)
NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle
pathForResource:@"weibo.plist" ofType:nil]];

导入Weibo.h,并在类扩展中声明一个数组成员变量用来装数据
_weibos = [NSMutableArray array];
for (NSDictionary *dict in array){
[_weibos addObject:(Weibo weiboWithDict:dict)];
}
}

步骤九:实现数据源方法
第二个数据源方法
return _weibos.count;
第三个数据源方法
// 1.去缓存池中取出cell
static NSString *ID = @”weibo“;
WeiboCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

//2.缓存池没有cell,重新创建cell
if (cell == nil){
cell = [[WeiboCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}
//3.传递模型数据
cell.weibo = _weibos[indexPath.row];

return cell;
}

二、计算子控件的frame
将设置数据的代码段放到新方法settingData中,然后在set方法中调用这个方法即可
-(void)setWeibo:(Weibo *)weibo
{
_weibo = weibo;

//1.设置微博数据
[self settingData]

//2.设置子控件的frame(x,y,width,height)
[self settingSubViewFrame];
}

-(void)settingSubviewFrame
{
// 1. 头像
CGFloat iconX = kCellBorder;
CGFloat iconY = kCellBorder;
_icon.frame = CGRectMake(iconX,iconY,kIconMH,kIconMH);

// 2. 昵称
CGFloat nameX = CGRectGetMaxX(_icon.frame)+ kCellBorder;
CGFloat nameY = iconY;
//计算用户名称的尺寸
CGSize nameSize = [_weibo.name sizeWithFont:_name.font];
_icon.frame = CGRectMake(nameX,nameY,nameSize.width,nameSize.height)

//3.vip
CGFloat vipX = CGRectGetMaxX(_name.frame)+ kCellBorder;
CGFloat vipY = nameY;
_icon.frame = CGRectMake(vipX,vipY,kvipMH,kvipMH);

//4.时间
CGFloat timeX = nameX;
CGFloat timeY = CGRectGetMaxY(_name.frame)+ kCellBorder;
CGSize timeSize = [_weibo.time sizeWithFont:_time.font];
_time.frame = CGRectMake(timeX,timeY,timeSize.width,timeSize.height);

//5.来源
CGFloat sourceX = CGRectGetMaxX(_time.frame)+ kCellBorder;
CGFloat sourceY = timeY;
NSString *sourceText = [NSString stringWithFormat:@"来自%@",_weibo.source];
CGSize sourceSize = [sourceText sizeWithFont:_source.font];
_source.frame = CGRectMake(sourceX,sourceY,sourceSize.width,sourceSize.height);

//6.正文
CGFloat contentX = iconX;
CGFloat contentY = MAX(CGRectGetMaxY(_time.frame),CGRectGetMaxY(_icon.frame))+ kCellBorder;
CGFloat contentW = self.frame.size.width - 2*kCellBorder;
//计算文字尺寸(显示文字的宽度)
CGSize contentSize = [_weibo.content sizeWithFont:_content.font constrainedToSize:CGSizeMake(contentW,MAXFLOAT)];
_content.frame = CGRectMake(contentX,contentY,contentW,contentSize.height) ;

//7.配图\计算cell的高度
CGFloat cellHeight = 0;
if (_weibo.image){ //有配图
CGFloat imageX = contentX;
CGFloat imageY = CGRectGetMaxY(_content.frame)+ kCellBorder;
_image.frame = CGRectMake(imageX,imageY,kImageWH,kImageWH);

CGFloat cellHeight = CGRectGetMaxY(_image.frame)+ kCellBorder;
} else {
CGFloat cellHeight = CGRectGetMaxY(_content.frame)+ kCellBorder;
}

因为是先调用代理方法再调用set方法,所以在set方法中计算高度然并卵
新建1个模型WeiboFrame用来存放一个cell内部所有子控件的frame
声明属性如iconF等,还有一个属性cellHeight和一个属性Weibo(@class Weibo)
将计算frame的一大串代码放到这个模型的实现文件中的setWeibo方法中
只要你把这个Weibo属性给它,它就会帮你计算frame

开始计算cell高度
//根据模型数据获得cell的高度
WeiboFrame *f = [[WeiboFrame alloc] init];
f.weibo = _weibos[indexPath.row];
return f.cellHeight;
*WeiboCell中不需要拥有Weibo属性,而是拥有WeiboFrame属性,这样既可以拿到Weibo数据,又可以拿到WeiboFrame数据
*修改settingSubviewFrame方法的代码
//1.头像
_icon.frame = _weiboFrame.iconF;
......

步骤总结
1>新建一个UITableViewCell的子类----WeiboCell
2>在创建cell的时候(initWithStyle:reuseIndetifier:方法中)添加cell内部需要使用的子控件(设置只需要设置一次的在init方法里设置)
(注意:只管创建添加子控件,先不要去管子控件的位置和尺寸)
3>新建一个模型类----Weibo,增加对应的数据属性
4>给WeiboCell增加一个Weibo模型属性,在拿到Weibo模型数据的同时设置子控件的属性
5>重写setWeibo:方法:在这里面取出Weibo模型的数据显示到子控件上

补充:
在viewDidLoad中注册一个xib文件,如果tableView通过标识在缓存池中没有取到可循环利用的Cell,就会加载MyCell1.xib文件来创建cell
[self.tableView registerNib[UINib nibWithNibName:@"MyCell1" bundle:nil]
forCellReuseIdentifier:@"Cell"];
如此一来,就不需要再第3个数据源方法中判断cell是否为nil了。

时间: 2024-10-09 23:03:52

iOS开发-通过代码自定义cell的相关文章

【iOS开发】TabelView自定义cell

自定义cell有两种方式: 第一种:通过创建xib文件. ①首先创建xib文件 ②创建xib文件对应 的模型A,名字与xib文件一样,并继承UITableViewCell类,并实现cellWithTableView的构造方法. ③在interface builder里更改xib文件默认的类,为第二步创建的模型类. ④创建数据模型B,并且A中包含数据模型B ⑤A通过懒加载B方法(就是重写B对象的setter方法)将控件赋值. 第二种:代码自定义cell ①新建一个继承UITableViewCell

【iOS开发-62】自定义cell制作团购页面、顶部图片轮播、底部模拟加载更多功能,核心是练习代理模式

(1)效果 (2)案例源代码免费下载 团购页面+iOS源代码+头部广告轮播+底部加载更多 (3)补充 在源代码中,有一处瑕疵:就是因为是单线程,所以在上下拖动页面的时候,上面的图片轮播会停止.所以我们需要兼顾,解决方案,把定时器加到当前的runLoop中. 即在WPTgHeaderView.m的playOn方法中添加一行代码: -(void)playOn{ timer=[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector

iOS开发总结-UITableView 自定义cell和动态计算cell的高度

UITableView cell自定义头文件: shopCell.h #import <UIKit/UIKit.h> @interface shopCell : UITableViewCell @property (strong, nonatomic)  UIImageView *image;@property (strong, nonatomic)  UILabel *name;@property (strong, nonatomic)  UILabel *itemshop;@propert

iOS -- UITableViewCell -- 通过代码自定义Cell(cell的高度不一致)

1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 Ø添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中) Ø进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片) 3.提供2个模型 Ø数据模型: 存放文字数据\图片数据 Øframe模型: 存放数据模型\所有子控件的frame\cell的高度 4.cell拥有一个frame模型(不要直接拥有数据

iOS UITableView通过代码自定义Cell(Cell高度不一定)

1.新建一个继承自UITableView的类 2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据 和 frame,并且子控件要添加到self.contentView中). 进行子控件的一次性的属性设置(有些属性只要设置一次,比如字体 和 某些固定的图片) 3.提供两个模型 数据模型:存放 文字数据 和 图片数据 frame模型:存放数据模型,所有子控件的frame,cell的高度 4.cell拥有一个frame模型 (不要直

iOS开发UI篇—以微博界面为例使用纯代码自定义cell程序编码全过程(一)

iOS开发UI篇-以微博界面为例使用纯代码自定义cell程序编码全过程(一) 一.storyboard的处理 直接让控制器继承uitableview controller,然后在storyboard中把继承自uiviewcontroller的控制器干掉,重新拖一个tableview controller,和主控制器进行连线. 项目结构和plist文件 二.程序逻辑业务的处理 第一步,把配图和plist中拿到项目中,加载plist数据(非png的图片放到spooding files中) 第二步,字

iOS开发UI篇—自定义瀑布流控件(cell的循环利用)

iOS开发UI篇—自定义瀑布流控件(cell的循环利用) 一.简单说明 当滚动的时候,向数据源要cell. 当UIScrollView滚动的时候会调用layoutSubviews在tableView中也是一样的,因此,可以用这个方法来监听scrollView的滚动,可以在在这个地方向数据源索要对应位置的cell(frame在屏幕上的cell). 示例: 当scrollView在屏幕上滚动的时候,离开屏幕的cell应该放到缓存池中去,询问即将(已经)进入到屏幕的cell,对于还没有进入到屏幕的ce

iOS 代码自定义cell示例

底色标黄为代码自定义cell重点处,入手从这几点即可. MyCell.h #import <UIKit/UIKit.h> @interface MyCell :UITableViewCell @property(nonatomic,strong)UILabel *ageLabel; @property(nonatomic,strong)UILabel *nameLabel; @property(nonatomic,strong)UILabel *additionLabel; - (instan

iOS开发多线程之自定义NSOperation

iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // 2 // YYViewController.h 3 // 01-自定义Operation 4 // 5 // Created by apple on 14-6-26. 6 // Copyright (c) 2014年 itcase. All rig