iOS如何实现表格的折叠效果?

本文介绍了一种在iOS应用中实现表格数据动态展示与分组控制的方法,通过自定义数据模型、数据源、代理方法以及自定义组头标题视图,实现了根据组的状态动态调整显示行为的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实现原理:就是在点击表格组头视图的时候,如果该表格视图的组展开了,就把改组的行设置为0,如果该组隐藏了,就显示该组的所有行。

效果如下:

二、实现步骤

1、定义一个数据模型用于封装数据

#import <Foundation/Foundation.h>

@interface MyData : NSObject
{
    NSMutableArray *_array;// 每组的数据
    BOOL _isShow;// 组的状态,yes显示组,no不显示组
    NSString *_name;// 组名
}
@property (nonatomic,retain) NSMutableArray *array;
@property (nonatomic,copy) NSString * name;
@property (nonatomic,assign) BOOL isShow;
@end

2、添加数据源

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view.
    // 全局的数据源
    dataArray = [[NSMutableArray alloc] init];
    // 添加数据
    for (int i='A'; i<='Z'; i++) {
        MyData *myData = [[MyData alloc] init];
        myData.name = [NSString stringWithFormat:@"%c",i];
        for (int j=0; j<10; j++) {
            [myData.array addObject:[NSString stringWithFormat:@"%c-%d",i,j]];
        }
        [dataArray addObject:myData];
    }
    myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460-44) style:UITableViewStylePlain];
    myTableView.dataSource = self;
    myTableView.delegate = self;
    myTableView.rowHeight = 30;
    [self.view addSubview:myTableView];
}

3.实现表格的代理方法


// 组数
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
{
    return [dataArray count];
}
// 根据状态来判断是否显示该组,隐藏组把组的行数设置为0即可
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    MyData *data = [dataArray objectAtIndex:section];
    if ([data isShow]) {
        return  [[data array] count];
    }else{
        return  0;
    }
}
// 添加每行显示的内容
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellName = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellName ];
    if (!cell) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellName] autorelease];
    }
    MyData *data = [dataArray objectAtIndex:indexPath.section];
    NSString *str = [[data array] objectAtIndex:indexPath.row];
    cell.textLabel.text = str;
    return cell;
}

4.自定义组的头标题视图,添加点击事件

// 定义头标题的视图,添加点击事件
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    MyData *data = [dataArray objectAtIndex:section];
    
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.frame = CGRectMake(0, 0, 320, 30);
    [btn setTitle:data.name forState:UIControlStateNormal];
    btn.tag = section;
    [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    if (section%2) {
        btn.backgroundColor = [UIColor darkGrayColor];
    }else{
        btn.backgroundColor = [UIColor lightGrayColor];
    }
    return btn;
}
- (void) btnClick:(UIButton *)btn
{
    MyData *data = [dataArray objectAtIndex:btn.tag];
    // 改变组的显示状态
    if ([data isShow]) {
        [data setIsShow:NO];
    }else{
        [data setIsShow:YES];
    }
    // 刷新点击的组标题,动画使用卡片
    [myTableView reloadSections:[NSIndexSet indexSetWithIndex:btn.tag] withRowAnimation:UITableViewRowAnimationFade];
}


评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值