一、介绍

之前已经实现过通过简单的XIB文件来自定义我们的tableViewCell,包括每一步的步骤和代码:http://www.cnblogs.com/daomul/p/4355999.html

现在我们采取另外一种方式,通过纯编写代码来实现自定义我们的tableview,那么什么时候使用XIB,是这样的,当我们的cell的高度是固定的时候,我们可以采用XIB文件,如果我们的cell高度是不固定的,那么就需要使用代码编写了

二、效果

话不多说,上一个没有放图,这个先看我们大概做出来的效果如下:

三、 实现步骤

四、代码清单

ViewController.m:

 //
// ViewController.m
// codeDefinedForTableviewcell
//
// Created by bos on 15-3-22.
// Copyright (c) 2015年 axiba. All rights reserved.
// #import "ViewController.h"
#import "weiboCell.h"
#import "Weibo.h"
#import "WeiboFrame.h" @interface ViewController ()
{
//全局变量,对应着从文件中取得的数据
//NSMutableArray *_weibos;
NSMutableArray *_weiboFrames;
} @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //从plist文件中加载数据数组
NSArray *arr = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data.plist" ofType:nil]]; //遍历添加到我们的微博模型中
_weiboFrames = [NSMutableArray array];
for (NSDictionary *dict in arr) {
WeiboFrame *wframe = [[WeiboFrame alloc]init];
wframe.weibo = [Weibo weiboWithDict:dict]; [_weiboFrames addObject:wframe];
}
/*_weibos = [NSMutableArray array];
for (NSDictionary *key in arr) { //每一个可变数组中存放每条模型(多少条就是对应着多少行 )
[_weibos addObject:[Weibo weiboWithDict:key]];
}*/
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _weiboFrames.count;
} -(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//1、去缓存池取出cell
weiboCell *cell = [tableView dequeueReusableCellWithIdentifier:[weiboCell getID]]; //2、如果不存在缓存,则创建一个
if (cell ==nil) {
cell = [[weiboCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[weiboCell getID]];
} //3、传递模型数据(相当于setWeibo,没有传递则)
//WeiboFrame *wframe = [[WeiboFrame alloc] init];
//wframe.weibo = _weiboFrames[indexPath.row];
cell.weiboframe = _weiboFrames[indexPath.row]; return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
//WeiboFrame *wframe = [[WeiboFrame alloc] init];
//wframe.weibo = _weibofr[indexPath.row];
//return wframe.cellHeight; return [_weiboFrames[indexPath.row] cellHeight];
} @end

WeiboCell.h

 //
// weiboCell.h
// codeDefinedForTableviewcell
//
// Created by bos on 15-3-22.
// Copyright (c) 2015年 axiba. All rights reserved.
// #import <UIKit/UIKit.h>
@class WeiboFrame; @interface weiboCell : UITableViewCell @property (nonatomic,strong) UILabel *iconlabel;
@property (nonatomic,strong) UILabel *namelabel;
@property (nonatomic ,strong) UILabel *timelabel;
@property (nonatomic,strong) UIImageView *vipImage;
@property (nonatomic,strong) UIImageView *picImage;
@property (nonatomic,strong) UILabel *contentLabel;
@property (nonatomic,strong) UILabel *from; @property (nonatomic,strong) WeiboFrame *weiboframe; +(NSString *)getID;
@end

WeiboCell.m

 //
// weiboCell.m 模型显示到我们的cell里面
// codeDefinedForTableviewcell
//
// Created by bos on 15-3-22.
// Copyright (c) 2015年 axiba. All rights reserved.
// #import "weiboCell.h"
#import "Weibo.h"
#import "WeiboFrame.h" #define kCellBorder 10
#define kIconWH 40 @interface weiboCell()
{
UIImageView *_icon;
UILabel *_name;
UILabel *_content;
UIImageView *_vip;
UIImageView *_pic;
UILabel *_from;
UILabel *_time;
} @end @implementation weiboCell -(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) { //不清楚高度则先添加基本得内部所有子控件
[self setData];
} return self;
} #pragma 设置微博数据以及高度frame
-(void)setWeiboframe:(WeiboFrame *)weiboframe
{
//1.将weibo负值给我们的weibo模型
_weiboframe = weiboframe; //2.设置微博数据
[self settingWeiboData]; //3.设置子控件的frame
[self settingWeiboFrame];
}
#pragma 设置微博数据
-(void)settingWeiboData
{
Weibo *weibo = _weiboframe.weibo;
//赋值
_icon.image = [UIImage imageNamed:weibo.icon]; _name.text = weibo.name; _content.text = weibo.content;
_content.numberOfLines = ; _from.text = weibo.from; _vip.hidden = !weibo.vip; _time.text = weibo.time; // 配图
if (weibo.pic) {
_pic.hidden = NO;
_pic.image = [UIImage imageNamed:weibo.pic];
}else
{
_pic.hidden = YES;
} }
#pragma 设置微博高度frame
-(void) settingWeiboFrame
{ //1、头像
_icon.frame = _weiboframe.iconFrame; //2、昵称
_name.frame = _weiboframe.nameFrame; //3VIP图标
_vip.frame = _weiboframe.vipFrame; //4、时间
_time.frame = _weiboframe.timeFrame; //5来源
_from.frame = _weiboframe.fromFrame; //6正文
_content.frame = _weiboframe.contentFrame; //7配图
if (_weiboframe.weibo.pic) { _pic.frame = _weiboframe.picFrame;
}
} #pragma 添加基本的内部控件
-(void)setData
{
//1、头像
_icon = [[UIImageView alloc] init];
[self.contentView addSubview:_icon]; //2、会员姓名
_name = [[UILabel alloc] init];
[self.contentView addSubview: _name]; //3、时间
_time = [[UILabel alloc] init];
_time.font = [UIFont systemFontOfSize:];
[self.contentView addSubview:_time]; //4、正文
_content= [[UILabel alloc] init];
[self.contentView addSubview:_content]; //5、VIP图标
_vip = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"vip.png"]];
[self.contentView addSubview:_vip]; //6、微博配图
_pic= [[UIImageView alloc] init];
[self.contentView addSubview:_pic]; //7、来源
_from = [[UILabel alloc] init];
_from.font = _time.font;
[self.contentView addSubview:_from]; } +(NSString *)getID
{
return @"cell";
} @end

Weibo.h

 //
// Weibo.h
// codeDefinedForTableviewcell
//
// Created by bos on 15-3-22.
// Copyright (c) 2015年 axiba. All rights reserved.
// #import <Foundation/Foundation.h> @interface Weibo : NSObject @property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *icon;
@property (nonatomic,copy) NSString *time;
@property (nonatomic, copy) NSString *pic;
@property (nonatomic,copy) NSString *content;
@property (nonatomic,copy) NSString *from;
@property (nonatomic,assign) BOOL vip; -(id) initWithDict:(NSDictionary *)dict;
+(id) weiboWithDict:(NSDictionary *)dict; @end

Weibo.m

 //
// Weibo.m 模型
// codeDefinedForTableviewcell
//
// Created by bos on 15-3-22.
// Copyright (c) 2015年 axiba. All rights reserved.
// #import "Weibo.h" @implementation Weibo -(id) initWithDict:(NSDictionary *)dict
{
if (self == [super init]) {
self.name =dict[@"name"];
self.icon = dict[@"icon"];
self.time = dict[@"time"];
self.content = dict[@"desc"];
self.from = dict[@"from"];
self.pic = dict[@"pic"];
self.vip = [dict[@"vip"] boolValue];
}
return self;
} //必须实现的类方法,否则类无法alloc 自己(self)
+(id) weiboWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
} @end

WeiboFrame.h

 //
// WeiboFrame.h
// codeDefinedForTableviewcell
//
// Created by bos on 15-4-8.
// Copyright (c) 2015年 axiba. All rights reserved.
// 用来存放某一个cell内部所有的子控件 的frame #import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> @class Weibo;
@interface WeiboFrame : NSObject // 头像 的frame
@property (nonatomic,assign,readonly) CGRect iconFrame;
// 是不是大V 的frame
@property (nonatomic,assign,readonly) CGRect vipFrame;
// 名字 的frame
@property (nonatomic,assign,readonly) CGRect nameFrame;
// 发表时间 的frame
@property (nonatomic,assign,readonly) CGRect timeFrame;
// 正文内容 的frame
@property (nonatomic,assign,readonly) CGRect contentFrame;
// 大图片 的frame
@property (nonatomic,assign,readonly) CGRect picFrame;
// 来自客户端 的frame
@property (nonatomic,assign,readonly) CGRect fromFrame; @property (nonatomic,assign,readonly) CGFloat cellHeight;
@property (nonatomic,strong) Weibo *weibo; @end

WeiboFram.m

 //
// WeiboFrame.m
// codeDefinedForTableviewcell
//
// Created by bos on 15-4-8.
// Copyright (c) 2015年 axiba. All rights reserved.
// yonglai #define kCellBorder 10
#define kIconWH 40 #import "WeiboFrame.h"
#import "Weibo.h" @implementation WeiboFrame -(void) setWeibo:(Weibo *)weibo
{
_weibo = weibo; //1、头像
CGFloat iconX = kCellBorder;
CGFloat iconY = kCellBorder;
_iconFrame = CGRectMake(iconX, iconY, kIconWH, kIconWH); //2、昵称
CGFloat nameX = CGRectGetMaxX(_iconFrame) + kCellBorder;
CGFloat nameY = iconY;
//宽高取决于文字宽度
CGSize nameSize = [self getLabelHeighDynamic:_weibo.name];
_nameFrame = CGRectMake(nameX, nameY, nameSize.width, nameSize.height); //3VIP图标 CGFloat vipX = CGRectGetMaxX(_nameFrame) + kCellBorder;
CGFloat vipY = nameY;
_vipFrame = CGRectMake(vipX, vipY, , ); //4、时间
CGFloat timeX = nameX;
CGFloat timeY = CGRectGetMaxY(_nameFrame) + kCellBorder;
CGSize timeSize = [self getLabelHeighDynamic:_weibo.time];
_timeFrame = CGRectMake(timeX, timeY, timeSize.width, timeSize.height); //5来源
CGFloat fromX = CGRectGetMaxX(_timeFrame) +kCellBorder;
CGFloat fromY = timeY;
CGSize fromSize = [self getLabelHeighDynamic: _weibo.from];
_fromFrame = CGRectMake(fromX, fromY, fromSize.width, fromSize.height); //6正文
CGFloat contentX = iconX;
CGFloat contentY = MAX(CGRectGetMaxY(_iconFrame), CGRectGetMaxY(_timeFrame));
CGRect contentSize = [self getContentFrameDynamic: _weibo.content];
_contentFrame = CGRectMake(contentX, contentY, contentSize.size.width, contentSize.size.height); //7配图
if (_weibo.pic.length > ) { CGFloat picX = contentX;
CGFloat picY = CGRectGetMaxY(_contentFrame) +kCellBorder;
_picFrame = CGRectMake(picX, picY, , ); _cellHeight = CGRectGetMaxY(_picFrame) + kCellBorder;
}
else
{
_cellHeight = CGRectGetMaxY(_contentFrame) +kCellBorder;
}
} #pragma 根据文字长度动态确定label的高度
-(CGSize)getLabelHeighDynamic:(NSString *)word
{
UIFont *fnt = [UIFont fontWithName:@"HelveticaNeue" size:18.0f];
CGSize size = [word sizeWithAttributes:[NSDictionary dictionaryWithObjectsAndKeys:fnt,NSFontAttributeName, nil]];
return size;
} #pragma 根据正文内容多少,动态确定正文content的frame -(CGRect)getContentFrameDynamic:(NSString *)word
{
// 宽度W
CGFloat contentW = - *kCellBorder;
// label的字体 HelveticaNeue Courier
UIFont *fnt = [UIFont fontWithName:@"HelveticaNeue" size:18.0f];
//_content.font = fnt; //_content.lineBreakMode = NSLineBreakByWordWrapping;
// iOS7中用以下方法替代过时的iOS6中的sizeWithFont:constrainedToSize:lineBreakMode:方法
CGRect tmpRect = [word boundingRectWithSize:CGSizeMake(contentW, ) options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObjectsAndKeys:fnt,NSFontAttributeName, nil] context:nil]; return tmpRect; } @end

五、遇到的问题总结

1、number函数写错, 记得是tableview先写,否则导致无法执行cellforRowAtIndexpath无法执行

2、忘记传递模型数据,导致set方法没有执行

3、IOS7中用以下方法

- (CGSize)sizeWithAttributes:(NSDictionary *)attrs;

替代过时的iOS6中的- (CGSize)sizeWithFont:(UIFont *)font 方法

4、如果头文件中遇到类似于“编绎显示Unknown type name “CGFloat”  错误解决方法”

直接加头文件:

#import <UIKit/UIKit.h>或者将Compile Sources As 改为 Objective-C++

5、在ViewDidLoad使用以下方法在取缓存池的值的时候,可以不用判断是否为空,会自动取缓冲取值,适用于6.0+

[self.tableView registerClass:[Mycell class] forCellReuseIdenifier:@"cellID"];

六、源代码下载地址:

http://pan.baidu.com/s/1kTqsTpH

OC开发_代码片段——代码编写自定义的tableViewCell的更多相关文章

  1. 安卓开发_浅谈ListView(自定义适配器)

    ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ...

  2. OC开发_代码片段——使用Xib自定义tableViewCell

    一.实现步骤 1.新建一个XIB文件:描述cell——tableCell.xib 2.新建UITableViewCell的子类,也就是cell文件:封装XIB内部的所有东西——TestCell.m \ ...

  3. OC开发_代码片段——代码编写简单的tableViewCell

    许久前写的简单的tableView例子,主要针对处理缓存.协议.数据源datasource.局部刷新等问题进行解析. 其实这是一篇不全面的记录,只是用来记录一些备忘的东西,更全面的是使用TablVie ...

  4. iOS开发_统计xcode代码行数

    如果要统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -nam ...

  5. OC开发_整理笔记——多线程之GCD

    一.进程和线程   二.各种队列! 1.GCD:Grand Central Dispatch 2.串行队列(Serial)      你可以创建任意个数的串行队列,每个队列依次执行添加的任务,一个队列 ...

  6. OC开发_整理笔记——友盟分享(社交化组件)

    0.友盟的地址 http://dev.umeng.com,进入友盟,在使用友盟之前我们需要注册账号获取key (1 进入我们的产品,添加新应用 (2  输入信息,然后就会获取到key 1.选择社会化分 ...

  7. VSCode插件开发全攻略(八)代码片段、设置、自定义欢迎页

    更多文章请戳VSCode插件开发全攻略系列目录导航. 代码片段 代码片段,也叫snippets,相信大家都不陌生,就是输入一个很简单的单词然后一回车带出来很多代码.平时大家也可以直接在vscode中创 ...

  8. VS Code项目中通过npm包的方式共享代码片段的方案实现

    VS Code项目中通过npm包的方式共享代码片段的方案实现 上周在 "VS Code项目中共享自定义的代码片段方案" 的文章中提到过一个共享代码片段的方案,上周经过调研后并没有发 ...

  9. VS中添加自定义代码片段

    前言 用#4敲出 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; int main(voi ...

随机推荐

  1. CSS控制显示图片的一部分

    使用情形:防止反复请求图片资源,我们经常采用一张图片多种效果或内容显示. 假设我有纸张竖直方向的一张图片,竖直y轴方向分别是字母:A,B,C.... 现在分别要显示A.B.C 等字母,我们的CSS可以 ...

  2. [HTML] 使用size和maxlength分别控制文本框宽度和输入字符数的限制

    ① size一般可以直观的看到,就是文本框的宽度,只能决定文本框的宽度,也就是可以看到的字符的个数. 如:size="5"  这意味着如果输入  我的国家是北京 那么只能看见  我 ...

  3. 'cl.exe' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    1.首先找到vcvars32.bat文件,一般在C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin文件夹下 2.打开cmd黑窗 ...

  4. C++/C语言的标准库函数与运算符的区别new/delete malloc/free

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++ ...

  5. 继电器是如何成为CPU的

    阅读目录(Content) 从电池.开关和继电器开始 用继电器做个与门 用继电器做个或门 用继电器做个异或门 做一些看起来可用的东西 小小约定 振荡器 加法器 寄存器 R-S触发器 D触发器 上升沿D ...

  6. 数据库之“on”“where”区别

    数据库在通过连接两张或者多张表返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户 在使用inner join(内连接)没有区别,但是 在使用left jion时,on和where条件的 ...

  7. C++之程序时间统计类实现

    /********** TimeCounter.h huangsy13@gmail.com **********/ #ifndef TIMECOUNTER #define TIMECOUNTER #i ...

  8. page指令属性简要介绍:

    page指令属性简要介绍: language=”java” 声明脚本语言的种类,暂时只能用”java” extends=”package.class” 标明JSP编译时需要加入的Java Class的 ...

  9. php -- 读取大文件

    在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...

  10. 【Java面试题】54 去掉一个Vector集合中重复的元素

    在Java中去掉一个 Vector 集合中重复的元素 1)通过Vector.contains()方法判断是否包含该元素,如果没有包含就添加到新的集合当中,适用于数据较小的情况下. import jav ...