_dataArray = [[NSMutableArray alloc] initWithObjects:@"乔丹", @"麦迪", @"艾弗森", @"詹姆斯", @"韦德", @"科比", @"约翰逊", nil];
_delArray = [[NSMutableArray alloc] init];
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 416) style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;
[self.view addSubview:_tableView];
[_tableView release];
UIBarButtonItem* button = [[[UIBarButtonItem alloc] initWithTitle:@"edit" style:UIBarButtonItemStyleBordered target:self action:@selector(buttonClick)] autorelease];
self.navigationItem.rightBarButtonItem = button;
UIBarButtonItem* leftButton = [[[UIBarButtonItem alloc] initWithTitle:@"del" style:UIBarButtonItemStyleBordered target:self action:@selector(deleteRows)] autorelease];
self.navigationItem.leftBarButtonItem = leftButton;
//点击edit事件,切换tableView的编辑状态
- (void)buttonClick{
if (_tableView.editing) {
[_delArray removeAllObjects];
[_tableView setEditing:NO animated:YES];
} else {
[_delArray removeAllObjects];
[_tableView setEditing:YES animated:YES];
}
}
//必写
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return _dataArray.count;
}
//必写
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"ID"];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ID"] autorelease];
}
NSString* str = [_dataArray objectAtIndex:indexPath.row];
cell.textLabel.text = str;
return cell;
}
//编辑部分 是否能编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
return YES;
}
//编辑类型 滑动删除还是点击删除
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert ;
}
//改变删除按钮上得文本
- (NSString*)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
return @"删除";
}
//处理编辑事件
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
//如果是删除的话
if (editingStyle == UITableViewCellEditingStyleDelete) {
//先删除数组里的,再删除tableView上对应的cell
[_dataArray removeObjectAtIndex:indexPath.row];
//重新加载全部数据,刷新数据
//[tableView reloadData];
//删除行
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
}
//如果编辑类型为插入的话
if (editingStyle == UITableViewCellEditingStyleInsert) {
[_dataArray insertObject:@"new" atIndex:indexPath.row];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
}
}
//多选删除
- (void)deleteRows{
//首先从数组中删除对应数据
NSMutableArray* array = [NSMutableArray array];
for (int i = 0; i < _delArray.count; i++) {
NSIndexPath* indexPath = [_delArray objectAtIndex:i];
NSString* str = [_dataArray objectAtIndex:indexPath.row];
[array addObject:str];
//_delArray 2 3 5 6
//_dataArray 0 1 2 3 4 5 6 7 8
}
[_dataArray removeObjectsInArray:array];
[_tableView deleteRowsAtIndexPaths:_delArray withRowAnimation:UITableViewRowAnimationMiddle];
[_delArray removeAllObjects];
}
//选中一行调用
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"我选中了:%d",indexPath.row);
if (tableView.editing) {
//编辑状态,用户选中cell得位置添加到数组里
[_delArray addObject:indexPath];
}
}
//取消选中一行调用
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"取消选中:%d",indexPath.row);
if (tableView.editing) {
[_delArray removeObject:indexPath];
}
}
tableView的重用机制?
(古代的圆水车)
通过重用单元格实现大量数据显示而采用的一种节省内存的机制
查看UITableView头文件,会找到NSMutableArray* visiableCells,和NSMutableDictnery* reusableTableCells两个结构。visiableCells内保存当前显示的cells,reusableTableCells保存可重用的cells。
TableView显示之初,reusableTableCells为空,那么tableViewdequeueReusableCellWithIdentifier:CellIdentifier返回nil。开始的cell都是通过[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]来创建,而且cellForRowAtIndexPath只是调用最大显示cell数的次数。
比如:有100条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是:
- 用[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加入到visiableCells数组,reusableTableCells为空。
- 向下拖动tableView,当cell1完全移出屏幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。
- 接着向下拖动tableView,因为reusableTableCells中已经有值,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用的时候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。cell1加入到visiableCells,cell1移出reusableTableCells;cell2移出visiableCells,cell2加入到reusableTableCells。之后再需要显示的Cell就可以正常重用了。
http://blog.csdn.net/mhw19901119/article/details/9083293
http://blog.sina.com.cn/s/blog_bf9843bf0101id9q.html
http://www.cnblogs.com/jy578154186/archive/2013/02/27/2935401.html
UITableView中Cell重用机制导致内容重复解决方法
-
方法1
将获得cell的方法从- (UITableViewCell)dequeueReusableCellWithIdentifier:(NSString)identifier 换为-(UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath -
方法2
通过为每个cell指定不同的重用标识符(reuseIdentifier)来解决。 -
方法3
删除重用cell的所有子视图
(前两个方法取消了cell重用机制,使得cell无法重用,所以才不会重复;而第三种是通过清空cell的子视图解决重复)
http://www.2cto.com/kf/201308/238449.html
http://www.bkjia.com/Androidjc/913755.html
//自定义UITableViewCell是加到cell.contentView上 , [self.contentView addSubview:self.label];
网友评论