1. 程式人生 > >【iOS】UITableView Cell自定義單選功能

【iOS】UITableView Cell自定義單選功能

今天分享下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,將引數更換,實現此效果。