iOS-UITableView2

UICollectionView

_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的情况是:

  1. 用[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加入到visiableCells数组,reusableTableCells为空。
  2. 向下拖动tableView,当cell1完全移出屏幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。
  3. 接着向下拖动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];

你可能感兴趣的:(iOS-UITableView2)