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


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

效果如下:

二、实现步骤

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

  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.  

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.实现表格的代理方法

[cpp] view plaincopy

    // 组数  
    - (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.自定义组的头标题视图,添加点击事件

[cpp] view plaincopy

    // 定义头标题的视图,添加点击事件  
    - (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];  
    }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值