美文网首页学无止境上海恩美路演iOS10
【iOS】UITableView Cell自定义单选功能

【iOS】UITableView Cell自定义单选功能

作者: x_code | 来源:发表于2017-02-17 16:07 被阅读1084次

    今天分享下cell的单选,自定义的,不是下图这种网上找到的打对勾的,我搜了好久,基本上都是打对勾的文章,就决定自己写一篇。基本上自己的app都会有一个风格吧,咱也不能一直用打对勾的方式去做(看起来是不是很low)。

    我们要实现的是下面的这种形式。瞬间好看了很多,高大上了很多是吧。


    自定义单选.gif

    具体我来给大家介绍一下。我这种方法有可能不是很好,有大神来,欢迎多多交流。

    首先在你自定义的cell里面加入一个UIImageView,因为你肯定要有选择和未选择两张图片的吧,所以这个UIImageView来切换图片。

    @property(nonatomic,strong)UIImageView *seletImage;
    

    注意:这里面为啥没用button,我主要考虑的是按钮如果只有一个小圆圈这么大的话,就不好点击。我的方法主要是结合UITableView中didSelectRowAtIndexPath这个代理方法实现的。

    当然,你需要在你自己的cell里面加入这个子视图,以及初始化这个对象。下面代码写在相应的位置。

     //添加到cell上
    [self.contentView addSubview:self.seletImage];
    
    //初始化
    -(UIImageView *)seletImage{
    if (!_seletImage) {
        _seletImage = [[UIImageView alloc]init];
    }
    return _seletImage;
    }
    
    //坐标位置
    [self.seletImage mas_makeConstraints:^(MASConstraintMaker *make) {
        @strongify(self);
        make.right.equalTo(self.contentView.mas_right).with.offset(-15);
        make.centerY.equalTo(self.self.contentView);
        make.height.mas_equalTo(22);
        make.width.mas_equalTo(22);
     }];
    

    然后我们还需要一个cell的ViewModel来记录cell中的各种数值变化,在这个ViewModel里我们加入一个参数用来判断是否这一行cell被点击。

    @property(nonatomic)BOOL isSelected;
    

    然后在回到这个cell中,我们需要用RAC来观察这个isSelected的参数变化,替换图片

       [[[RACObserve(self.viewModel, isSelected) takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread] subscribeNext:^(NSString  *x){
        @strongify(self);
        if ([x boolValue]==YES) {
            [self.seletImage setImage:[UIImage imageNamed:@"alarmsetting_selected"]];
        }else{
            [self.seletImage setImage:[UIImage imageNamed:@"alarmsetting_notselected"]];
        }
    }];
    

    好了,最后一步,让我们回到这个cell对应的ViewController中,在didSelectRowAtIndexPath上做文章。

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
      //遍历viewModel的数组,如果点击的行数对应的viewModel相同,将isSelected变为Yes,反之为No
        for (NSInteger i = 0; i<[self.viewModel.ItemArray count]; i++) {
            ItemViewModel *itemViewModel = self.viewModel.ItemArray[i];
            if (i!=indexPath.row) {
                itemViewModel.isSelected = NO;
            }else if (i == indexPath.row){
                itemViewModel.isSelected = YES;
            }
        }
    
        [self.tableView reloadData];
    }
    

    这里简单解释一下,因为每一个cell都有一个对应的ViewModel,这个ViewModel又是放在ViewController的ViewModel数组中的。因此遍历,取出对应点击行数的ViewModel,将参数更换,实现此效果。

    相关文章

      网友评论

      • 72ce649a634a:viewModel是什么
      • smirkk:其实在didSelectRowAtIndexPath方法中,还有更加简单的方法做单选,你这个如果数组中的对象是10万个,效率就大打折扣了。我的思路是:
        1,在@interface中定义一个变量用于记录选中时候的indexPat@property (nonatomic, strong) NSIndexPath *selectIndexPath;
        2,在didSelectRowAtIndexPath中,先取消之前选中的,然后记录下当前选中的位置索引,最后,把当前选中的设置为选中状态

        ItemViewModel *itemViewModel = self.viewModel.ItemArray[self.selectIndexPath];
        itemViewModel.isSelected = NO;
        self.selectIndexPath = indexPath;
        ItemViewModel *selectedItemViewModel = self.viewModel.ItemArray[indexPath];
        selectedItemViewModel.isSelected = Yes;
        x_code:有道理,感谢回复

      本文标题:【iOS】UITableView Cell自定义单选功能

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