UITableView 多选(Multiple Select)列表的实现


      最近的项目需要用到多选列表,照例自己有了初步想法之后,google了下其他人的实现,发现了两个主要的实现方法:

  1. 在设置cell的editingStyle为3。不过这个属性是非公开的,所以使用会有被打回的风险;而且使用固定数字返回的话,Api更新有可能导致不可预估的问题;再者无法对选中标记进行定制。请参考:http://www.iphonedevwiki.net/index.php?title=UITableView
  2. 自己自定义一个UITableViewCell。网上有实例:http://cocoawithlove.com/2009/01/multiple-row-selection-and-editing-in.html

      为了安全起见,个人采用了自定义UITableViewCell的方法,但是查看了2.中的代码后,感觉其代码过于复杂,使用一个单独的CellController来对Cell进行管理,内部的函数重复命名,比较难直接移植应用。并且考虑到项目中需要选中和移动两种编辑状态,因此自己重写了一份多选列表的实现。代码见:https://github.com/zjamming/MultiSelectTableView

     简单思路:

  1. 不对UITableViewCell做太多的修改,加入一个_mSelected的布尔变量用于判断是否处于选中状态:
    //构造UITableViewCell
    #pragma mark -
    #pragma mark UITableViewCell
    - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
    {
        
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
        
        if (self) 
        {      
            _mSelected = NO;
            CGRect indicatorFrame = CGRectMake(-30, abs(self.frame.size.height - 30)/ 2, 30, 30);
            _mSelectedIndicator = [[UIImageView alloc] initWithFrame:indicatorFrame];
            _mSelectedIndicator.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin;
            [self.contentView addSubview:_mSelectedIndicator];
        }
        return self;
    }
    
    
    
    - (void)layoutSubviews
    {
        [super layoutSubviews];
        
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationBeginsFromCurrentState:YES];
        
        if (_mSelected)
        {
            if (((UITableView *)self.superview).isEditing)
            {
                self.backgroundView.backgroundColor = [UIColor colorWithRed:223.0/255.0 green:230.0/255.0 blue:250.0/255.0 alpha:1.0];
            }
            else
            {
                self.backgroundView.backgroundColor = [UIColor clearColor];
            }
            
            self.textLabel.textColor = [UIColor darkTextColor];
            [_mSelectedIndicator setImage:[UIImage imageNamed:@"icon_sel_mark.png"]];
            self.accessoryType = UITableViewCellAccessoryCheckmark;
        }
        else
        {
            self.backgroundView.backgroundColor = [UIColor clearColor];
            self.textLabel.textColor = [UIColor grayColor];
            [_mSelectedIndicator setImage:[UIImage imageNamed:@"icon_unsel_mark.png"]];
            self.accessoryType = UITableViewCellAccessoryNone;
        }
        
        [UIView commitAnimations];
    }
    
    

  2. 在点击UITableView某一行时,改变_mSelected的值,然后重绘UITableViewCell:
    //构造UITableViewCell
    
    - (void)changeMSelectedState
    {
        _mSelected = !_mSelected;
        [self setNeedsLayout];
    }
    

       具体请看代码。由于代码量比较小,实现也比较简单,未作太多的注释,有问题敬请留言。如有不足之处,也请指正。

你可能感兴趣的:(iOS)