tableView常见属性:
tableView.rowHeight = 20; // 设置tableView每一行的cell高度
tableView.sectionHeaderHeight = 40; // 设置tableView每一组的头部高度
tableView.sectionFooterHeight = 20; // 设置tableView每一组的尾部高度
tableView.separatorColor = [UIColor redColor]; // 设置cell的分割线颜色
tableView.tableHeaderView = [[UIButton alloc] init]; // 设置整张UITableView的头部
tableView.tableFooterView = [[UIButton alloc] init]; // 设置整张UITableView的尾部
- UITableViewCell的属性
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;// 设置右边显示的指示样式
cell.accessoryView = [[UISwitch alloc] init]; // 设置cell右边显示的控件,优先级高于accessoryType;
cell.selectionStyle = UITableViewCellSelectionStyleNone; //选中的样式
cell.backgroundColor = [UIColor redColor]; // 设置cell 的背景颜色
cell.backgroundView = [[UIView alloc] init]; // 设置背景图片,背景图片的优先级高于背景颜色
cell.selectedBackgroundView = [[UIView alloc] init]; //设置选中的背景view
- UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"点击了按钮");
}
/**
* 返回每一组头部控件
*/
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
return [[UISwitch alloc] init];
}
/**
* 返回每一组尾部控件
*/
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
return [[UISwitch alloc] init];
}
- UITableViewController
- UITableViewController控制器包含了tableView 对象,包含了delegate、dataSource;
细节问题
- 如果只显示几行存在的cell,没有的隐藏分割线,如果不显示组的头视图在顶端悬停,可以把UITableView 的样式改为UITableViewStyleGrouped,如果要显示悬停组的头视图,则可采用设置UITableView 的尾视图。eg:
tableView.tableFooterView = [[UIView alloc] init];
UITableView的样式分为默认样式,默认样式,tableView的头视图悬停在顶端,如果是分组样式,则不会悬停。
性能优化
/**
当cell将要在界面上显示的时候调用一次
*/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] init];
return cell;
}
- 以上这样,当用户来回滚动时,会连续创建。
优化方案,cell的创建,先去缓存池找,如果不存在,再创建。这样一共只会创建比屏幕上显示的多一个cell。最大限度优化cell的创建。
具体创建如下:
/**
* 当cell将要在界面上显示的时候调用一次
*/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.根据identifier去缓存池中取,是否有可用的cell;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellId"];
// 2.如果缓存池没有可循环利用的cell,自己创建
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellId"];
}
// 3. 设置数据
cell.textLabel.text = [NSString stringWithFormat:@"%zd --分区 %zd -- 行",indexPath.section, indexPath.row];
return cell;
}
所有cell都一样的设置,应该放在if里面,为避免重复利用,在创建cell的方法里有 if就应该有else
要显示cell的textLabel属性,cell 的类型必须设置为UITableViewCellStyleSubtitle
凡事修改了模型数据,都必须要更新tableView [tableView reloadData];
在某些时候只是修改了指定的行,全部cell都刷新,影响性能,因此可以采用局部刷新,只刷新改变的部分。
NSArray *indexPath = @[NSIndexPath indexPathForRow:0 inSection:0];
// 第一个参数数组
// 第二个参数,动画效果
//注意:这个方法使用的前提是数组模型不变
[tableView reloadRowsAtIndexPaths: withRowAnimation:]
// 当数组模型增加了使用如下方法
[tableView insertRowsAtIndexPaths: withRowAnimation:];
// 当数组模型减少了使用如下方法
[tableView deleteRowsAtIndexPaths: withRowAnimation:];
**
- 左滑删除cell
// 左滑删除,必须遵守UITableViewDelegate
/**
* 实现了这个方法就能显示左滑删除的功能
* 点击左滑出现的Delete按钮会调用这个方法
*/
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
// 先拿到要删除的模型
[array removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
}
/**
* 修改默认Delegate按钮的文字
*/
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
return @"删除";
}
/**
* 这个方法的点击按钮的事件不会调用
*- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath这个方法,删除的动作在block里实现
*/
- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
// tableView.editing = YES; // 默认为NO,非编辑模式,左滑出现按钮的时候会到编辑模式
UITableViewRowAction *action = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"关注" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
//点击了关注要回到原来的状态
// [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
tableView.editing = NO;
}];
UITableViewRowAction *action1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
//此按钮的点击只会来到这里
// 先拿到要删除的模型
[array removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
}];
return @[action,action1];
}
- 点击左边的红色按钮单行删除
//点击删除按钮后,把UITableView改为编辑模式
// tableView.editing = !tableView.isEditing;
// 也可以实现动画
[tableView setEditing:!tableView.isEditing animated:];
- 批量删除
- 在viewDidLoad方法里面设置
// 告诉tableView在编辑模式下可以多选
tableView.allowsMultipleSelectionDuringEditing;
在删除按钮的方法中
NSMutableArray *deletedArray = [NSMutableArray array];
for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows){
[deletedArray addObject:totleArray[indexPath.row]];
}
// 修改模型
[totleArray removeObjectsInArray:deletedArray];
// 刷新表格
[tableView reloadData];
- tableView.indexPathsForSelectedRows 表明当前选中的cell
- 不能一边遍历一边删除
要删除一部分数据可以先把要删除的数据保存在一个临时的数组中,
然后再用: [mutArray removeObjectsInArray:array];