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

Implementação de função de seleção de célula personalizada em UITableView no iOS

Hoje vou compartilhar sobre a seleção de cell, personalizada, não a那种网上找到的打对勾的,我搜了好久,基本上都是打对勾的文章,就决定自己写一篇。基本上自己的app都会有一个风格吧,咱也不能一直用打对勾的方式去做(看起来是不是很low)。

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

Vou explicar a vocês. Este método pode não ser o melhor, se aparecerem grandes gênios, estou sempre aberto a trocas de ideias.

Primeiro, adicione um UIImageView ao seu cell personalizado, porque você definitivamente terá duas imagens: uma de selecionada e uma de não selecionada, então este UIImageView será usado para alternar as imagens.

@property(nonatomic,strong)UIImageView *seletImage;

Atenção: Por que não usei botão? Minha principal consideração é que, se o botão for apenas um pequeno círculo, é difícil clicar. Minha abordagem principal é combinar o método de agente didSelectRowAtIndexPath do UITableView.

Claro, você precisa adicionar essa subvista ao seu próprio cell e inicializar esse objeto. O código a seguir deve ser escrito na posição correspondente.

 //Adicionar ao cell
[self.contentView addSubview:self.seletImage];
//Inicialização
-(UIImageView *)seletImage{
if (!_seletImage) {
  _seletImage = [[UIImageView alloc]init];
}
return _seletImage;
}
//Posição
[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);
 };

Então, precisamos de um ViewModel para a cell para registrar as variações de valores dentro da cell, onde adicionamos um parâmetro para determinar se essa linha da cell foi clicada.

@property(nonatomic) BOOL isSelected;

Depois disso, quando voltarmos para essa cell, precisamos usar RAC para observar a variação do parâmetro isSelected, substituindo a imagem

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

Bem, o último passo, vamos voltar para o ViewController correspondente a essa cell, e fazer algo no didSelectRowAtIndexPath.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
  [tableView deselectRowAtIndexPath:indexPath animated:YES];
 //Percorrer o array viewModel, se o viewModel correspondente ao número da linha clicada for o mesmo, alterar isSelected para Yes, caso contrário, para 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];
}

Explicarei de forma simples, pois cada cell tem um ViewModel correspondente, e esse ViewModel está no array ViewModel do ViewController. Portanto, ao percorrer, extraia o ViewModel correspondente ao número da linha clicada, altere os parâmetros para implementar esse efeito.

Isso é tudo o que há no artigo, espero que ajude no seu aprendizado, e espero que todos apoiem o tutorial Yell.

Declaração: O conteúdo deste artigo foi extraído da Internet, pertence ao respectivo proprietário, o conteúdo foi contribuído e carregado voluntariamente pelos usuários da Internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidades legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w3Declaração: O conteúdo deste artigo foi extraído da Internet, pertence ao respectivo proprietário, o conteúdo foi contribuído e carregado voluntariamente pelos usuários da Internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidades legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w

Você também pode gostar