首页 > 代码库 > UITableVIew与UICollectionView带动画删除cell时崩溃的处理
UITableVIew与UICollectionView带动画删除cell时崩溃的处理
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,注意.
UITableVIew与UICollectionView带动画删除cell时崩溃的处理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。