tableView小结
2016-05-11 本文已影响146人
只敲代码不偷桃
tableView点击cell之后不会一直有背景效果
- [tableView deselectRowAtIndexPath:indexPath animated:NO];
- cell.selectionStyle = UITableViewCellSelectionStyleNone;(始终没有效果)
- 刷新特定行的cell
[self.tableView reloadRowsAtIndexPaths:@[
[NSIndexPath indexPathForRow:0 inSection:0],
[NSIndexPath indexPathForRow:1 inSection:0]
]
withRowAnimation:UITableViewRowAnimationLeft];
- 插入特定行数的cell
[self.tableView insertRowsAtIndexPaths:@[
[NSIndexPath indexPathForRow:0 inSection:0],
[NSIndexPath indexPathForRow:1 inSection:0]
]
withRowAnimation:UITableViewRowAnimationLeft];
- 删除特定行数的cell
[self.tableView deleteRowsAtIndexPaths:@[
[NSIndexPath indexPathForRow:0 inSection:0],
[NSIndexPath indexPathForRow:1 inSection:0]
]
withRowAnimation:UITableViewRowAnimationLeft];
非等高的cell(方法一: 用model保存cell的高度)
- 在模型中增加一个cellHeight属性,用来存放对应cell的高度
- 在cell的模型属性set方法中调用[self layoutIfNeed]方法强制布局,然后计算出模型的cellheight属性值
- 在控制器中实现tableView:estimatedHeightForRowAtIndexPath:方法,返回一个估计高度,比如200
- 在控制器中实现tableView:heightForRowAtIndexPath:方法,返回cell的真实高度(模型中的cellHeight属性)
- 在�Model的.h文件中
/** cell的高度 */
@property (assign, nonatomic) CGFloat cellHeight;
- 在自定义的cell的.h文件中声明Model
/** 模型数据 */
@property (nonatomic, strong) NBStatus *status;
- 在自定义的cell的.m文件中,模型属性的set方法中
- (void)setStatus:(NBStatus *)status
{
_status = status;
//各种赋值操作.........
// 强制布局
[self layoutIfNeeded];
// 计算cell的高度
status.cellHeight = ... + 10;
}
- 在控制器的.m文件中
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.statuses.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NBStatusCell *cell = [NBStatusCell cellWithTableView:tableView];
cell.status = self.statuses[indexPath.row];
return cell;
}
/**返回每一行的高度*/
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NBStatus *staus = self.statuses[indexPath.row];
return staus.cellHeight;
}
/**
* 返回每一行的估计高度
* 只要返回了估计高度,那么就会先调用tableView:cellForRowAtIndexPath:方法创建cell,再调用tableView:heightForRowAtIndexPath:方法获取cell的真实高度*/
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 200;
}
非等高的cell(方法二: 用字典保存cell的高度)
/** 存放所有cell的高度 */
@property (strong, nonatomic) NSMutableDictionary *heights;
/////////////////
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.statuses.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NBStatusCell *cell = [NBStatusCell cellWithTableView:tableView];
cell.status = self.statuses[indexPath.row];
// 强制布局
[cell layoutIfNeeded];
// 存储高度
self.heights[@(indexPath.row)] = @(cell.height);
return cell;
}
#pragma mark - 代理方法
/**
* 返回每一行的高度
*/
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [self.heights[@(indexPath.row)] doubleValue];
}
/**
* 返回每一行的估计高度
* 只要返回了估计高度,那么就会先调用tableView:cellForRowAtIndexPath:方法创建cell,再调用tableView:heightForRowAtIndexPath:方法获取cell的真实高度
*/
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 200;
}
当然也可以用用一个FrameModel来保存高度,基本原理都差不多,本文主要是注意那个估计高度,因为实现那个方法只会,tableView的代理方法的顺序会发生变化