动态展开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的高度:

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

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

时间: 2024-08-31 02:17:58

动态展开tableView的cell[2]的相关文章

动态展开tableView的cell[1]

动态展开tableView的cell[1] 源码地址:https://github.com/xerxes235/HVTableView 虽然作者写的demo很好看,可是,你很难理解他是怎么玩的-_-!!,不信,你可以去下载他的demo试一下:) 本人运行时的效果如下图: 源码: RootViewController.m // // RootViewController.m // AnimationTableView // // Copyright (c) 2014年 Y.X. All right

使用HVTableView动态展开tableView中的cell

使用HVTableView动态展开tableView中的cell 效果: 源码: HVTableView.h 与 HVTableView.m // // HVTableView.h // HRVTableView // // Created by Hamidreza Vakilian on 25/11/2013 // Copyright (c) 2013 Hamidreza Vakilian. All rights reserved. // Website: http://www.infracy

动态切换tableView中的cell的种类

动态切换tableView中的cell的种类 为什么要动态切换tableView中cell的种类呢?如果项目经理不出这种需求,你也就见不到这篇文章了:) 效果: 源码: 首先,你要准备3种cell,直接继承系统的就行了. // // RootViewController.m // ChangeCell // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "RootViewController.h" #import

解决tableView中cell动态加载控件的重用问题

解决tableView中cell动态加载控件的重用问题 tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问题,即使你能做到该cell只根据数值加载了一回控件,你也没法保证不出现重用问题:) 效果(请注意查看,移动下面的格子时,上面出现了重用的问题) 源码: YXCell.h // // YXCell.h // YXTableView // // Copyright (c) 2014年 Y.X. All

ios-iOS中点击tableview的cell没有调用代理方法didSelectRow

问题描述 iOS中点击tableview的cell没有调用代理方法didSelectRow 我在控制器中创建一个tableview也给这个控制器设置了代理和数据源可是点击cell没有调用- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; 解决方案 这个方法是UITableView的代理方法,你可以将tableView的delegate设置为控制器,然后在cotro

tableview的cell问题-关于tableview的cell的问题

问题描述 关于tableview的cell的问题 我自定义的cell,给每一个cell上都添加了一个UIPanGestureRecognizer手势,但是我现在想让其中一个cell触发手势的时候别的cell手势都禁用,也就是两个手指拖动两个cell是没有效果的,我该如何判断呢? 我判断了 if (!(gesture.maximumNumberOfTouches = 1)) { return; } 似乎没有效果啊..... 求在线解答 解决方案 关于- tableView:cellForRowAt

TableView的cell加载倒计时重用问题解决方案

TableView的cell加载倒计时重用问题解决方案 效果     说明 1. 写过类似需求的朋友一定知道,TableView上面加载倒计时功能会遇到复杂的重用问题难以解决 2. 本人提供一种解决思路,高效完美的解决此类倒计时重用问题   源码 https://github.com/YouXianMing/CountDownTimerForTableView   细节  

ios-怎么动态生成tableview?

问题描述 怎么动态生成tableview? 我现在要实现一个功能是 我打开一个页面后,提交一个请求到后端, 从后端取得数据 再在客户端显示出来, 我用tableview 来显示. 怎么样根据后端返回的数据来动态生成tableview? 解决方案 通过afnetworking 获取数据,成功获取数据后 tableview 执行reload 函数 解决方案二: 先设计好UITableViewCell的样式,根据返回的数据,拼装NSMuTableArray,然后加载到UITableView中 解决方案

更新tableView的某个cell

更新tableView的某个cell 异步加载完数据后更新某个cell,这应该是非常常见的使用方法了,我们经常会用reloadData. 效果: 源码: // // RootViewController.m // DataTableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "RootViewController.h" #import "SDWebImage.h" @inte