您的位置:首页 > 产品设计 > UI/UE

折叠UITableView分组实现方法

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

实现的大体思路是每个分组用一个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


这样就大功告成了,可以根据情况获取数据源。不过博主也是刚学习了一段时间的菜鸟,有什么错误希望大家指正,共同进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: