【iOS】UITableView Cell自定義單選功能
阿新 • • 發佈:2019-01-25
今天分享下cell的單選,自定義的,不是下圖這種網上找到的打對勾的,我搜了好久,基本上都是打對勾的文章,就決定自己寫一篇。基本上自己的app都會有一個風格吧,咱也不能一直用打對勾的方式去做(看起來是不是很low)。
我們要實現的是下面的這種形式。瞬間好看了很多,高大上了很多是吧。
具體我來給大家介紹一下。我這種方法有可能不是很好,有大神來,歡迎多多交流。
首先在你自定義的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,將引數更換,實現此效果。