UITableVIew与UICollectionView带动画删除cell时崩溃的处理

-会崩溃的原因是因为没有处理好数据源与cell之间的协调关系-

效果:

tableView的源码:

ModelCell.h + ModelCell.m

//
//  ModelCell.h
//  Set
//
//  Created by YouXianMing on 14/11/24.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>
@class ModelCell;

@protocol ModelCellDelegate <NSObject>
@optional
- (void)modelCellButton:(ModelCell *)cell;
@end

@interface ModelCell : UITableViewCell

@property (nonatomic, weak)   id<ModelCellDelegate>  delegate;

@property (nonatomic, strong) UILabel *title;

@end
//
//  ModelCell.m
//  Set
//
//  Created by YouXianMing on 14/11/24.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ModelCell.h"

@implementation ModelCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        UIButton *button = [[UIButton alloc] initWithFrame:self.bounds];
        [button addTarget:self
                   action:@selector(buttonsEvent:)
         forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button];

        _title               = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 200, 44)];
        _title.textAlignment = NSTextAlignmentLeft;
        _title.font          = [UIFont fontWithName:@"HelveticaNeue-Thin" size:17.f];
        [self addSubview:_title];
    }

    return self;
}

- (void)buttonsEvent:(UIButton *)button {
    if (_delegate && [_delegate respondsToSelector:@selector(modelCellButton:)]) {
        [_delegate modelCellButton:self];
    }
}

@end

控制器源码:

//
//  ViewController.m
//  Set
//
//  Created by YouXianMing on 14/11/24.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "ModelCell.h"

@interface ViewController ()<UITableViewDelegate, UITableViewDataSource, ModelCellDelegate>
@property (nonatomic, strong) UITableView    *tableView;
@property (nonatomic, strong) NSMutableArray *dataArray;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 初始化数据源
    _dataArray = [NSMutableArray array];
    [_dataArray addObject:@"YouXianMing"];
    [_dataArray addObject:@"Job"];
    [_dataArray addObject:@"NoZuoNoDie"];
    [_dataArray addObject:@"XiaoMing"];
    [_dataArray addObject:@"Smith"];
    [_dataArray addObject:@"K.K.K."];

    // 初始化tableView
    _tableView = [[UITableView alloc] initWithFrame:self.view.bounds
                                              style:UITableViewStylePlain];
    _tableView.delegate       = self;
    _tableView.dataSource     = self;
    _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    [self.view addSubview:_tableView];
    [_tableView registerClass:[ModelCell class] forCellReuseIdentifier:@"YouXianMing"];
}

#pragma mark - 代理
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [_dataArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ModelCell *cell = [tableView dequeueReusableCellWithIdentifier:@"YouXianMing"];
    cell.delegate   = self;
    cell.title.text = _dataArray[indexPath.row];

    return cell;
}

- (void)modelCellButton:(ModelCell *)cell {
    // 获取到cell的indexPath
    NSIndexPath *indexPath = [_tableView indexPathForCell:cell];

    // 删除数据源
    [_dataArray removeObjectAtIndex:indexPath.row];

    // 执行删除动画效果
    [_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
}

@end

UICollectionView源码:

ModelCell.h + ModelCell.m

//
//  ModelCell.h
//  collection
//
//  Created by YouXianMing on 14/11/25.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>
@class ModelCell;

@protocol ModelCellDelegate <NSObject>
@optional
- (void)modelCellEvent:(ModelCell *)cell;
@end

@interface ModelCell : UICollectionViewCell

@property (nonatomic, weak)   id<ModelCellDelegate>  delegate;
@property (nonatomic, strong) UILabel               *title;

@end
//
//  ModelCell.m
//  collection
//
//  Created by YouXianMing on 14/11/25.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ModelCell.h"

@implementation ModelCell

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        _title               = [[UILabel alloc] initWithFrame:self.bounds];
        _title.textAlignment = NSTextAlignmentCenter;
        [self addSubview:_title];
        self.layer.borderWidth = 1.f;

        UIButton *button = [[UIButton alloc] initWithFrame:self.bounds];
        [button addTarget:self
                   action:@selector(buttonEvent:)
         forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button];
    }
    return self;
}

- (void)buttonEvent:(UIButton *)button {
    if (_delegate && [_delegate respondsToSelector:@selector(modelCellEvent:)]) {
        [_delegate modelCellEvent:self];
    }
}

@end

CellLayout.h + CellLayout.m

//
//  CellLayout.h
//  collection
//
//  Created by YouXianMing on 14/11/25.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface CellLayout : UICollectionViewFlowLayout

@end
//
//  CellLayout.m
//  collection
//
//  Created by YouXianMing on 14/11/25.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "CellLayout.h"

@implementation CellLayout

- (instancetype)init {
    self = [super init];
    if (self) {
        self.itemSize                = CGSizeMake([UIScreen mainScreen].bounds.size.width / 3.f, 140); // 单元格尺寸
        self.sectionInset            = UIEdgeInsetsMake(0, 0, 0, 0);                                   // 单元格边缘
        self.minimumInteritemSpacing = 0;                                                              // 横排单元格最小间隔
        self.minimumLineSpacing      = 0;                                                              // 单元格最小行间距
    }
    return self;
}

@end

控制器源码:

//
//  ViewController.m
//  collection
//
//  Created by YouXianMing on 14/11/25.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "CellLayout.h"
#import "ModelCell.h"

@interface ViewController ()<UICollectionViewDataSource, UICollectionViewDelegate, ModelCellDelegate>
@property (nonatomic, strong) UICollectionView *collectionView;
@property (nonatomic, strong) NSMutableArray   *dataArray;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 初始化数据源
    _dataArray = [NSMutableArray array];
    [_dataArray addObject:@"YouXianMing"];
    [_dataArray addObject:@"Job"];
    [_dataArray addObject:@"NoZuoNoDie"];
    [_dataArray addObject:@"XiaoMing"];
    [_dataArray addObject:@"Smith"];
    [_dataArray addObject:@"K.K.K."];

    // 创建出UICollectionView
    _collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds
                                         collectionViewLayout:[CellLayout new]];
    _collectionView.backgroundColor = [UIColor whiteColor];
    _collectionView.delegate        = self;
    _collectionView.dataSource      = self;
    [_collectionView registerClass:[ModelCell class] forCellWithReuseIdentifier:@"YouXianMing"];
    [self.view addSubview:_collectionView];
}

#pragma mark - 代理
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return [_dataArray count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    ModelCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"YouXianMing"
                                                                forIndexPath:indexPath];
    cell.title.text = _dataArray[indexPath.row];
    cell.delegate   = self;

    return cell;
}
- (void)modelCellEvent:(ModelCell *)cell {
    // 获取到cell的indexPath
    NSIndexPath *indexPath = [_collectionView indexPathForCell:cell];

    // 删除数据源
    [_dataArray removeObjectAtIndex:indexPath.row];

    // 执行删除动画效果
    [_collectionView deleteItemsAtIndexPaths:@[indexPath]];
}

@end

分析:

注意:

1. 先取得cell的indexPath

2. 删除数据源

3. 执行删除cell的操作,带动画

执行delete操作的时候,并不会刷新数据源,不会执行reloadData,注意.

时间: 2024-10-07 22:11:47

UITableVIew与UICollectionView带动画删除cell时崩溃的处理的相关文章

RumTime实践之--UITableView和UICollectionView缺省页的实现

有关RunTime的知识点已经看过很久了,但是一直苦于在项目中没有好的机会进行实际运用,俗话说"光说不练假把式",正好最近在项目中碰到一个UITableView和UICollectionView在数据缺省的情况下展示默认缺省页的需求,这个时候RunTime大展拳脚的时候就到了. 大致的实现思路是这样的,因为UITableView和UICollectionView都是继承自系统的UIScrollView,所以为了同时实现UITableView和UICollectionView的缺省页,我

Android实现GridView的item长按拖动删除实现(带动画效果)

领导这几天让做一个项目,就是可以实现像支付宝首页一样的可以长按拖动,删除的界面,以前没做过,领导让我做的时候觉得简直是老虎吃天,无从下手啊,可是领导的任务还是要实现的,没办法,就自己网上找咯,但是网上的demo五花八门无法满足我的需求,而且bug还很多,所以最后就自己实现了,说实话,这个效果困扰了我好几个星期,因为其中牵扯的知识点太多了,什么事件分发机制,动画效果,互换位置的算法,还有拖动,这些我都没有接触过,所以只有一点一点来做咯,如果大家还没有了解过这些知识点,我建议搭建先去了解一下,毕竟这

UITableView 自带编辑删除 自定义按钮

一:UITableView 自带编辑删除 1:实现两个方法即可 #pragma mark   tableView自带的编辑功能 -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ //方法实现后,默认实现手势滑动删除的方法 if (editingStyle!

UITableView (4): 在TableView中移动cell和Section 从TableView中删除cell和section

一  .问题:你想用流畅直观的动画来移动和拖拽TableView中的cell和section 方案: 用moveSection:toSection:方法把一个Section移动到新位置. 用moveRowAtIndexPath:toIndexPath:方法把一个cell从当前位置移动到新位置 例子: 创建一个TableView并在其中加载3个Section,每个Section有3个cell #pragma - mark 初始化数据 - (NSMutableArray *)newSectionWi

一个加载时带动画效果的ListBoxItem

原文:一个加载时带动画效果的ListBoxItem 今天我们来谈一下ListBoxItem这个控件,ListBoxItem是直接从ContentControl继承而来的,所以可以添加到任何具有Content属性的控件中去,常见的ListBoxItem可以放到ListBox中,也可以放到ItemsControl中去,ListBoxItem可以横向和TreeViewItem进行比较,只不过TreeViewItem是直接从HeaderedItemsControl继承过来的,然后再继承自ItemsCon

UITableView和UICollectionView的cell重用问题

APP的一个页面用到了自定义的UITableViewCell,由于iOS框架的cell重用机制,遇到了一个BUG,总结一下 现象 自定义的UITableViewCell里有一个UIButton,点击这个button以后,需要改变cell的样式,包括换UILabel字体颜色,禁用该UIButton等.结果发现,点击按钮之后,不仅当前cell的字体颜色变了,还有另外几个cell的字体颜色也跟着变,而且是随机的 原因 后来想到,应该是由于iOS的cell重用机制造成的,原来的代码类似: -(void)

iOS8自动调整UITableView和UICollectionView布局

本文讲述了UITableView.UICollectionView实现self-sizing cell布局的知识,以及如何用InvalidationContext优化UICollectionView布局的更新. 背景 iOS越来越人性化了,用户可以在设置-通用-辅助功能中动态调整字体大小了.你会发现所有iOS自带的APP的字体大小都变了,可惜我们开发的第三方APP依然是以前的字体.在iOS7之后我们可以用UIFont的preferredFontForTextStyle:类方法来指定一个样式,并让

iOS 8自动调整UITableView和UICollectionView布局

本文讲述了UITableView.UICollectionView实现 self-sizing cell 布局的知识,以及如何用 InvalidationContext 优化 UICollectionView 布局的更新. 背景 iOS 越来越人性化了,用户可以在设置-通用-辅助功能中动态调 “” 阅读器 UITableViewUICollectionView (via:玉令天下的Blog) 本文讲述了UITableView.UICollectionView实现 self-sizing cell

复习知识点:UITableView和UICollectionView的常用属性

UITableView UICollectionView  //UICollectionViewLayout //UICollectionViewLayout决定了UICollectionView如何显示在界面上,Apple提供了一个最简单的默认layout对象:UICollectionViewFlowLayout. //Flow Layout是一个Cells的线性布局方案,并具有页面和页脚.其可定制的内容如下: //itemSize属性 //设定全局的Cell尺寸,如果想要单独定义某个Cell