UITableView--02(自定义cell)

UITableView-02(自定义cell)

自定义等高cell

纯代码frame

新建一个继承自UITableViewCell的子类,比如SJTGCell

@interface SJTGCell : UITableViewCell
@end

在SJTGCell.m文件中

  • 重写-initWithStyle:reuseIdentifier:方法

    • 在这个方法中添加所有需要显示的子控件
    • 给子控件做一些初始化设置(设置字体、文字颜色等)
/**
 *  在这个方法中添加所有的子控件
 */
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        // ......
    }
    return self;
}

  • 重写-layoutSubviews方法

    • 一定要调用[super layoutSubviews]
    • 在这个方法中计算和设置所有子控件的frame
/**
 *  在这个方法中计算所有子控件的frame
 */
- (void)layoutSubviews
{
    [super layoutSubviews];

    // ......
}

在SJTGCell.h文件中提供一个模型属性,比如SJTG模型

@class SJTG;

@interface SJTGCell : UITableViewCell
/** 团购模型数据 */
@property (nonatomic, strong) SJTG *tg;
@end

在SJTGCell.m中重写模型属性的set方法

  • 在set方法中给子控件设置模型数据
- (void)setTg:(SJTG *)tg
{
    _tg = tg;

    // .......
}

在控制器中

  • 注册cell的类型
[self.tableView registerClass:[SJTGCell class] forCellReuseIdentifier:ID];

  • 给cell传递模型数据

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 访问缓存池
    SJTGCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

// 设置数据(传递模型数据)
    cell.tg = self.tgs[indexPath.row];

return cell;
}


纯代码Autolayout

新建一个继承自UITableViewCell的子类,比如SJTGCell

@interface SJTGCell : UITableViewCell
@end

在SJTGCell.m文件中

  • 重写-initWithStyle:reuseIdentifier:方法

    • 在这个方法中添加所有需要显示的子控件
    • 给子控件做一些初始化设置(设置字体、文字颜色等)
    • 添加子控件的完整约束
/**
 *  在这个方法中添加所有的子控件
 */
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        // ......
    }
    return self;
}

在SJTGCell.h文件中提供一个模型属性,比如SJTG模型

@class SJTG;

@interface SJTGCell : UITableViewCell
/** 团购模型数据 */
@property (nonatomic, strong) SJTG *tg;
@end

在SJTGCell.m中重写模型属性的set方法

  • 在set方法中给子控件设置模型数据
- (void)setTg:(SJTG *)tg
{
    _tg = tg;

    // .......
}

在控制器中

  • 注册cell的类型
[self.tableView registerClass:[SJTGCell class] forCellReuseIdentifier:ID];

  • 给cell传递模型数据

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 访问缓存池
    SJTGCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

// 设置数据(传递模型数据)
    cell.tg = self.tgs[indexPath.row];

return cell;
}


xib方式

新建一个继承自UITableViewCell的子类,比如SJTGCell

@interface SJTGCell : UITableViewCell
@end

新建一个xib文件(文件名最好跟类名一致,比如SJTGCell.xib)

  • 修改cell的class为SJTGCell

  • 绑定循环利用标识

  • 添加子控件,设置子控件约束

  • 将子控件连线到类扩展中
@interface SJTGCell()
@property (weak, nonatomic) IBOutlet UIImageView *iconImageView;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
@property (weak, nonatomic) IBOutlet UILabel *buyCountLabel;
@end

在SJTGCell.h文件中提供一个模型属性,比如SJTG模型

@class SJTG;

@interface SJTGCell : UITableViewCell
/** 团购模型数据 */
@property (nonatomic, strong) SJTG *tg;
@end

在SJTGCell.m中重写模型属性的set方法

  • 在set方法中给子控件设置模型数据
- (void)setTg:(SJTG *)tg
{
    _tg = tg;

    // .......
}

在控制器中

  • 注册xib文件
[self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([SJTGCell class]) bundle:nil] forCellReuseIdentifier:ID];

  • 给cell传递模型数据

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 访问缓存池
    SJTGCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

// 设置数据(传递模型数据)
    cell.tg = self.tgs[indexPath.row];

return cell;
}


storyboard方式

新建一个继承自UITableViewCell的子类,比如SJTGCell

@interface SJTGCell : UITableViewCell
@end

在storyboard文件中,找到UITableView里面的cell(动态cell)

  • 修改cell的class为SJTGCell

  • 绑定循环利用标识

  • 添加子控件,设置子控件约束

  • 将子控件连线到类扩展中
@interface SJTGCell()
@property (weak, nonatomic) IBOutlet UIImageView *iconImageView;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
@property (weak, nonatomic) IBOutlet UILabel *buyCountLabel;
@end

在SJTGCell.h文件中提供一个模型属性,比如SJTG模型

@class SJTG;

@interface SJTGCell : UITableViewCell
/** 团购模型数据 */
@property (nonatomic, strong) SJTG *tg;
@end

在SJTGCell.m中重写模型属性的set方法

  • 在set方法中给子控件设置模型数据
- (void)setTg:(SJTG *)tg
{
    _tg = tg;

    // .......
}

在控制器中

  • 给cell传递模型数据

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *ID = @"tg";
    // 访问缓存池
    SJTGCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

// 设置数据(传递模型数据)
    cell.tg = self.tgs[indexPath.row];

return cell;
}


自定义不等高cell(每一个cell的高度不一样)

纯代码frame

给模型增加frame数据

  • 所有子控件的frame
  • cell的高度
@interface SJStatus : NSObject
/**** 文字\图片数据 ****/
// .....

/**** frame数据 ****/
/** 头像的frame */
@property (nonatomic, assign) CGRect iconFrame;
// .....
/** cell的高度 */
@property (nonatomic, assign) CGFloat cellHeight;
@end

  • 重写模型cellHeight属性的get方法
- (CGFloat)cellHeight
{
    if (_cellHeight == 0) {
        // ... 计算所有子控件的frame、cell的高度
    }
    return _cellHeight;
}

在控制器中

  • 实现一个返回cell高度的代理方法

    • 在这个方法中返回indexPath位置对应cell的高度
/**
 *  返回每一行cell的具体高度
 */
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    SJStatus *status = self.statuses[indexPath.row];
    return status.cellHeight;
}

  • 给cell传递模型数据
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *ID = @"tg";
    // 访问缓存池
    SJStatusCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    // 设置数据(传递模型数据)
    cell.status = self.statuses[indexPath.row];

    return cell;
}

新建一个继承自UITableViewCell的子类,比如SJStatusCell

@interface SJStatusCell : UITableViewCell
@end

在SJStatusCell.m文件中

  • 重写-initWithStyle:reuseIdentifier:方法

    • 在这个方法中添加所有需要显示的子控件
    • 给子控件做一些初始化设置(设置字体、文字颜色等)
/**
 *  在这个方法中添加所有的子控件
 */
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        // ......
    }
    return self;
}

在SJStatusCell.h文件中提供一个模型属性,比如SJStatus模型

@class SJStatus;

@interface SJStatusCell : UITableViewCell
/** 团购模型数据 */
@property (nonatomic, strong) SJStatus *status;
@end

在SJStatusCell.m中重写模型属性的set方法

  • 在set方法中给子控件设置模型数据
- (void)setStatus:(SJStatus *)status
{
    _status = status;

    // .......
}

重写-layoutSubviews方法

  • 一定要调用[super layoutSubviews]
  • 在这个方法中设置所有子控件的frame

/**
 *  在这个方法中设置所有子控件的frame
 */
- (void)layoutSubviews
{
    [super layoutSubviews];

// ......
}


时间: 2024-10-08 07:21:08

UITableView--02(自定义cell)的相关文章

【UIKit】UITableView.09 自定义cell

UITableView.09 自定义cell : 注意:在创建一个故事版的时候,需要将控制器的class修改成对应的class否则效果实现不了[如图] 1.这段代码就是用来设置cell所对应的xib,类似于绑定  // 1.想要使用文件包里面的资源就要使用[NSBundle mainBundle] // 2.loadNibNamed的意思是加载一个xib文件,名字为BookCell cell=[[[NSBundle mainBundle]loadNibNamed:@"BookCell"

Swift_ uitableview使用自定义cell

uitableview 使用 xib 的自定义cell 新建cell:(假如命名 MyCell) 使用: 向 tableview 注册 nib 全局变量 let cellIdentifier = "myCell" myTableView!.registerNib(UINib(nibName: "MyCell", bundle:nil), forCellReuseIdentifier: cellIdentifier) 然后在 cellForRowAtIndexPath

第?一讲:UITableView 高级 自定义cell , cell自适应高度

一.自定义cell(包括cell的自定义,以及直接赋值的方法) 自定义cell就是创建一个UITableViewCell的子类. 把cell上的控件创建都封装在子类中,简化UIViewController中的代码 示例代码分析:(这个例子包括cell的自定义,以及直接赋值的方法) 1.需要建立tabelViewCell类, 在其中进行cell上控件的添加 2.在tabelViewCell.m中进行初始化,和layoutSubviews的frame布局的操作 tabelViewCell.h定义属性

UITableView的自定义cell

自定义UITableViewCell大致有两类方法: <一>使用nib 1.xib中指定cell的Class为自定义cell类型(注意不是设置File's Owner的class) 2.调用 tableView 的 registerNib:forCellReuseIdentifier:方法向数据源注册cell [_tableView registerNib:[UINib nibWithNibName:@"xxxxxCell" bundle:nil] forCellReuse

UITableView自定义Cell中,纯代码编程动态获取高度

在UITableView获取高度的代理方法中,经常需要根据实际的模型重新计算每个Cell的高度.直接的做法是在该代理方法中,直接根据模型来返回行高:另 [1]-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 一种比较优雅的方式是将高度的获取方法放在一个单独的frame中[2],frame中包含了该Cell显示需要的数据模型. 但是在IOS8之后,苹果提供了一个

关于UITableView选中效果以及自定义cell上的控件响应事件

tableView默认的点击效果是:点击cell:A,出现点击效果,点另一个cell:B的时候,A的点击效果才会消失. 1.对于tableView,比较常用的效果,是点击表格行,出现效果,点击完毕,效果消失 那么就要在代码里做一些设置.代码如下: -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath

iOS深入学习(UITableView系列4:使用xib自定义cell)

可以通过继承UITableViewCell重新自定义cell,可以像下面一样通过代码来自定义cell,但是手写代码总是很浪费时间, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 //CustomTableViewCell.h文件 @interface CustomTableViewCell:UITableViewCell @property (nonat

iOS UITableView表视图(3)自定义cell

1.自定义cell 2.多种cell 的混合使用 3.cell自适应高度 自定义cell就是创建一个UITableViewCell的子类. 把cell上的控件创建都封装在子类中,简化UIViewController中的代码 子视图控件添加到cell的contentView上 cell中的控件如何显示Model中的信息? cell中声明一个Model类型的属性,viewController中获取到Model对象后赋值给cell的Model属性,cell中重写Model的setter方法,把Mode

UI学习笔记---第十一天UITableView表视图高级-自定义cell

自定义cell,多类型cell混合使用,cell自适应高度 自定义cell就是创建一个UITableViewCell的子类 把cell上的空间创建都封装在子类中,简化viewController中的代码 cell中的空间如何显示Model中的信息 cell中声明一个Model类型的属性,viewController中获取到Model对象后赋值给cell的Model属性 cell中重写Model的setter方法,把Model对象中的内容重新赋值给各个控件 M和V不直接通信,C负责M和V之间进行通

IOS开发中UITableView(表视图)的性能优化及自定义Cell

IOS开发中UITableView(表视图)的滚动优化及自定义Cell IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITableView实现的.UITableView这个控件中的列表的每一行是一个cell,当UITableView中cell数量特别大的时候,由于每次都需要alloc分配内存并初始化,会导致app运行不流畅,所以可以使用苹果提供的几个方法进行优化,我把这个过程记录下来供自己以后查阅. 当然,既然说到优化,那我们