zoukankan      html  css  js  c++  java
  • 折叠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

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

  • 相关阅读:
    luogu P1162 填涂颜色 x
    【説明する】素数
    codevs 4064 组合 x
    codevs 2039 骑马修栅栏 USACO x
    codevs 2038 香甜的黄油x+luogu P1828 x
    [HIHO1079]离散化(线段树、染色)
    [HIHO1196]高斯消元·二(高斯消元、枚举自由变元)
    hihoCoder太阁最新面经算法竞赛17
    [POJ1753]Flip Game(异或方程组,高斯消元,枚举自由变量)
    [POJ1681]Painter's Problem(高斯消元,异或方程组,状压枚举)
  • 原文地址:https://www.cnblogs.com/yuen/p/5050951.html
Copyright © 2011-2022 走看看