UITableView探究

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];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

里奇001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值