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