• 动态展开tableView的cell[2]


    动态展开tableView的cell[2]

    http://code4app.com/ios/%E5%8A%A8%E6%80%81%E6%B7%BB%E5%8A%A0cell/53845f8a933bf0740a8b458a

    这份代码也是参考别人而写的-_-!

    效果:

    其实呢,这份代码本人是不推荐的,很难维护,因为他的原理就是添加删除cell,会有这复杂的删除添加逻辑.

    源码:

    //
    //  RootViewController.m
    //  InsertTableViewCell
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "RootViewController.h"
    
    @interface RootViewController ()<UITableViewDelegate, UITableViewDataSource>
    
    @property (nonatomic, strong) UITableView     *tableView;
    @property (nonatomic, strong) NSMutableArray  *dataArray;
    
    @end
    
    @implementation RootViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 初始化数据源
        NSDictionary *dic = @{@"Cell"       : @"MainCell",
                              @"isAttached" : @(NO)};
        
        NSArray *array = @[dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic,
                           dic, dic, dic, dic, dic, dic, dic, dic, dic, dic, dic];
        _dataArray     = [NSMutableArray arrayWithArray:array];
        
        // 初始化tableView
        _tableView     = [[UITableView alloc] initWithFrame:self.view.bounds
                                                      style:UITableViewStylePlain];
        _tableView.delegate       = self;
        _tableView.dataSource     = self;
        [self.view addSubview:_tableView];
    }
    
    // ====================================
    #pragma mark - 
    #pragma mark dataSource
    // ====================================
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return _dataArray.count;
    }
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return 1;
    }
    
    // 重绘重用会一直走这个方法
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"重用");
        
        if ([_dataArray[indexPath.row][@"Cell"] isEqualToString:@"MainCell"])
        {
            static NSString *reusedID = @"YouXianMing";
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reusedID];
            if (cell == nil)
            {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                              reuseIdentifier:reusedID];
            }
            
            cell.textLabel.text  = @"YouXianMing";
            cell.selectionStyle  = UITableViewCellSelectionStyleNone;
            cell.backgroundColor = [UIColor whiteColor];
            
            return cell;
        }
        
        if ([_dataArray[indexPath.row][@"Cell"] isEqualToString:@"AttachedCell"])
        {
            static NSString *reusedID = @"AttachedCell";
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reusedID];
            if (cell == nil)
            {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                              reuseIdentifier:reusedID];
            }
            
            cell.textLabel.text      = @"NoZuoNoDie";
            cell.textLabel.textColor = [UIColor redColor];
            cell.textLabel.font      = [UIFont fontWithName:@"HelveticaNeue-Thin"
                                                       size:12.f];
            cell.selectionStyle      = UITableViewCellSelectionStyleNone;
            cell.backgroundColor     = [UIColor whiteColor];
            
            return cell;
        }
        
        return nil;
    }
    
    // ====================================
    #pragma mark -
    #pragma mark delegate
    // ====================================
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"计算高度");
    
        if ([self.dataArray[indexPath.row][@"Cell"] isEqualToString:@"MainCell"])
        {
            return 50;
        }
        else
        {
            return 30;
        }
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"选择了第 %d 行", indexPath.row);
        
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        
        NSIndexPath *path = nil;
        
        if ([self.dataArray[indexPath.row][@"Cell"] isEqualToString:@"MainCell"])
        {
            // 如果点击的时MainCell,则添加一行
            path = [NSIndexPath indexPathForItem:(indexPath.row + 1)
                                       inSection:indexPath.section];
        }
        else
        {
            path = indexPath;
        }
        
        if ([self.dataArray[indexPath.row][@"isAttached"] boolValue] == YES)
        {
            // 关闭附加cell
            self.dataArray[path.row - 1] = @{@"Cell"       : @"MainCell",
                                             @"isAttached" : @(NO)};
            
            [self.dataArray removeObjectAtIndex:path.row];
            
            [self.tableView beginUpdates];
            [self.tableView deleteRowsAtIndexPaths:@[path]
                                  withRowAnimation:UITableViewRowAnimationAutomatic];
            [self.tableView endUpdates];
            
        }
        else
        {
            // 打开附加cell
            self.dataArray[path.row - 1] = @{@"Cell"       : @"MainCell",
                                             @"isAttached" : @(YES)};
            
            NSDictionary * addDic        = @{@"Cell"       : @"AttachedCell",
                                             @"isAttached" : @(YES)};
            
            [self.dataArray insertObject:addDic
                                 atIndex:path.row];
            
            [self.tableView beginUpdates];
            [self.tableView insertRowsAtIndexPaths:@[path]
                                  withRowAnimation:UITableViewRowAnimationAutomatic];
            [self.tableView endUpdates];
        }
    }
    
    @end

    核心的地方-

    执行下面的操作(增加或者删除修改等):

    会导致强制计算所有cell的高度:

    这一点没有处理好是会影响性能的,注意哦.

    没有更多的地方需要说的了......

  • 相关阅读:
    java中将一个文件夹下所有的文件压缩成一个文件
    nodejs 指定全局安装路径和缓存路径
    webstrom 2019.2激活教程+激活工具
    CoreOnLineTransactionService.java
    CoreOnLineTransactionMapper.xml
    短信长度判断:判断是长短信
    sxnx-sms山西农信错误信息+处理方法
    Cannot format given Object as a Date
    cpu个数、核数、线程数、Java多线程关系的理解+物理cpu数和cpu核数和逻辑cpu数和vcpu区别
    如何判断短信内容是否是长短信??
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3822412.html
Copyright © 2020-2023  润新知