English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Реализация пользовательской функциональности выбора в ячейках UITableView в iOS

Сегодня я хочу поделиться своим опытом по созданию радио-кнопки в cell, пользовательской, не как на следующей картинке, которую можно найти в Интернете, я искал очень долго, в основном встречал статьи с галочками, поэтому я решил написать свою статью. У каждого приложения есть свой стиль, и нам не нужно всегда использовать галочки (они выглядят не очень стильно).

Мы реализуем такую форму. Она сразу стала выглядеть лучше, стала выше, не так ли?

Теперь я попытаюсь рассказать вам о нём. Этот метод может не быть очень хорошим, если есть гуру, пожалуйста, делитесь своими мыслями.

Сначала добавьте в свой пользовательский cell UIImageView, потому что вы, наверняка, будете иметь изображения для выбора и не выбора, поэтому этот UIImageView будет переключать изображения.

@property(nonatomic,strong)UIImageView *seletImage;

Внимание: почему здесь не используется кнопка? Я 主要考虑的是, если у кнопки только маленький кружок, то её трудно нажать. Мой метод в основном реализован с помощью дельгата метода didSelectRowAtIndexPath в UITableView.

Конечно, вам нужно добавить этот подвид в свой 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);
 };

Затем нам также нужен ViewModel для cell, чтобы отслеживать изменения различных значений в cell, и в этом ViewModel мы добавим параметр для определения, был ли этот ряд cell нажат.

@property(nonatomic)BOOL isSelected;

Затем вернемся в эту cell и наблюдаем за изменениями параметра isSelected с помощью RAC, чтобы заменить изображение

  [[[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"]];
  }
};

Хорошо, последний шаг, вернемся в ViewController, связанный с этой cell, и поработаем над методом 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 находится в массиве ViewModel в ViewController. Поэтому для этого эффекта遍яем, берем ViewModel соответствующего нажатого ряда, меняем параметры.

Вот и все, что есть в этой статье, надеюсь, это поможет вам в изучении. Также希望大家多多支持呐喊教程。

Заявление: содержание этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, самостоятельно загружен, сайт не имеет права собственности, не был отредактирован вручную и не несет ответственности за связанные с этим юридические вопросы. Если вы обнаружите спорное содержимое, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @), и предоставьте соответствующие доказательства. При обнаружении факта нарушения авторских прав сайт незамедлительно удаляет спорное содержимое.

Рекомендуем к просмотру