你的位置:首页 > 操作系统

[操作系统]折叠UITableView分组实现方法


做项目的时侯用到了折叠分组,最近就研究了一下,找了一些网上的项目,发现有一些缺点,研究了几天自己终于写出了一个。而且分组的数据源比较灵活,每组之间的状态没有什么影响。

 

实现的大体思路是每个分组用一个section来保存,row0用来保存分组的标题,后面的cell保存每个分组的数据。

 

1.首先要创建一个保存每组的分组信息的model类,包括分组名,每组里面的cell,和当前组的开关状态。

//MySection.h#import <Foundation/Foundation.h>@interface MySection : NSObject@property (nonatomic) BOOL isOpen;@property (nonatomic) NSMutableArray *dataArray;@property (nonatomic) NSString *name;@end

//MySection.m#import "MySection.h"@interface MySection ()@end@implementation MySection- (instancetype)init{  self = [super init];  self.isOpen = false;  self.name = @"分组";  self.dataArray = [[NSMutableArray alloc]init];  for (int i = 0; i < 5; i++) {    NSString *string = [NSString stringWithFormat:@"NO.%i",i];        [self.dataArray addObject:string];  }    return self;}@end

2.通过一个viewController来管理tableView。

//ViewController.h#import <UIKit/UIKit.h>@interface ViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>@end

//ViewController.m#import "ViewController.h"#import "MySection.h"@interface ViewController ()@property (nonatomic) UITableView *tableView;@property (nonatomic) NSIndexPath *selectedIndexPath;@property (nonatomic) NSMutableArray *sections;@end@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];    self.tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStyleGrouped];    self.sections = [[NSMutableArray alloc]init];  [self initData];    self.tableView.delegate = self;  self.tableView.dataSource = self;    //设置每组之间的距离为0  self.tableView.sectionFooterHeight = 0;  self.tableView.sectionHeaderHeight = 0;    [self.view addSubview:self.tableView];}//初始化数据- (void)initData{  for (int i = 0; i < 5; i++) {    MySection *section = [[MySection alloc]init];    section.name = [NSString stringWithFormat:@"分组%i",i + 1];    [self.sections addObject:section];  }}- (void)didReceiveMemoryWarning {  [super didReceiveMemoryWarning];}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  MySection *theSection = self.sections[section];    //根据分组开关状态和数据源动态改变每组row的个数  if (theSection.isOpen) {    return [theSection.dataArray count];  }else{    return 1;  }}//分组数目- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{  return [self.sections count];}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{  UITableViewCell *cell = [[UITableViewCell alloc]init];    //从数据源数组中取出当前cell对应的对象  MySection *section = self.sections[indexPath.section];    //如果row为0,则为标题  if (indexPath.row == 0) {    cell.textLabel.text = section.name;    cell.backgroundColor = [UIColor grayColor];  }else{    //为每组中cell赋值    cell.textLabel.text = section.dataArray[indexPath.row - 1];  }    return cell;}- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{  MySection *section = self.sections[indexPath.section];    //选中标题cell,且对应的组没有打开  if (!section.isOpen) {        NSLog(@"section:%@ open!",section.name);    section.isOpen = YES;        NSMutableArray *a = [[NSMutableArray alloc]init];        for (int i = 1; i < [section.dataArray count]; i++) {      NSIndexPath *addIndexPath = [NSIndexPath indexPathForRow:i inSection:indexPath.section];      [a addObject:addIndexPath];    }        [self.tableView beginUpdates];        [self.tableView insertRowsAtIndexPaths:a withRowAnimation:UITableViewRowAnimationNone];        [self.tableView endUpdates];  }else if (indexPath.row == 0){    //选中的cell对应的组已经打开,且选中的是row0    NSLog(@"section:%@ close!",section.name);    section.isOpen = !section.isOpen;        NSMutableArray *b = [[NSMutableArray alloc]init];        for (int i = 1; i < [section.dataArray count]; i++) {      NSIndexPath *redIndexPath = [NSIndexPath indexPathForRow:i inSection:indexPath.section];      [b addObject:redIndexPath];    }    [self.tableView beginUpdates];        [self.tableView deleteRowsAtIndexPaths:b withRowAnimation:UITableViewRowAnimationTop];        [self.tableView endUpdates];  }  }//判断是否为标题cell设置行高- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{  if (indexPath.row != 0) {    return 77;  }else{    return 44;  }}@end

3.AppDelegate里面没什么特别的了,不过还是贴出来吧。

//AppDelegate.m#import "AppDelegate.h"#import "ViewController.h"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];    ViewController *vc = [[ViewController alloc]init];    self.window.rootViewController = vc;  self.window.backgroundColor = [UIColor whiteColor];    [self.window makeKeyAndVisible];    return YES;}@end

这样就大功告成了,可以根据情况获取数据源。不过博主也是刚学习了一段时间的菜鸟,有什么错误希望大家指正,共同进步。