美文网首页
iOS-UITableView2

iOS-UITableView2

作者: 我是谁重要吗 | 来源:发表于2018-03-29 21:26 被阅读10次

    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

          本文链接:https://www.haomeiwen.com/subject/hlvvcftx.html