Quando você toca em uma linha em a UITableView
, a linha é destacada e selecionada. É possível desativar isso para que tocar em uma linha não funcione?
Quando você toca em uma linha em a UITableView
, a linha é destacada e selecionada. É possível desativar isso para que tocar em uma linha não funcione?
Respostas:
Para mim, o seguinte funcionou bem:
tableView.allowsSelection = false
Isso significa que didSelectRowAt#
simplesmente não funcionará. Ou seja, tocar em uma linha da mesa, como tal, não fará absolutamente nada. (E, portanto, obviamente, nunca haverá uma animação selecionada.)
(Observe que, se nas células você tiver UIButton
ou quaisquer outros controles, é claro que esses controles ainda funcionarão. Quaisquer controles que você possua na célula da tabela , não têm nenhuma relação com a capacidade do UITableView de permitir que você "selecione uma linha" usando didSelectRowAt#
.)
Outro ponto a ser observado é o seguinte: Isso não funciona quando UITableView
está no modo de edição. Para restringir a seleção de células no modo de edição, use o código abaixo:
tableView.allowsSelectionDuringEditing = false
selectionStyle
propriedade na célula: cell.selectionStyle = UITableViewCellSelectionStyle.None
em Swift ou cell.selectionStyle = UITableViewCellSelectionStyleNone
em Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
chamar, cell.selectionStyle = .None
é desejado. Se você não deseja ou não deseja que a função delegada seja chamada (por exemplo, ter um campo de texto em uma tabela tableViewCell), tableView.allowsSelection = false
tudo bem.
Tudo que você precisa fazer é definir o estilo de seleção na UITableViewCell
instância usando:
Objetivo-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
ou
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 e 4.x:
cell.selectionStyle = .none
Além disso, certifique-se de não implementar -tableView:didSelectRowAtIndexPath:
na sua exibição de tabela delegar ou excluir explicitamente as células que você deseja que não tenham nenhuma ação se implementá-la.
Como li este post recentemente e me ajudou, eu queria postar outra resposta para consolidar todas as respostas (para a posteridade).
Portanto, existem 5 respostas diferentes, dependendo da lógica e / ou resultado desejados:
1.Para desativar o realce azul sem alterar nenhuma outra interação da célula:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Eu uso isso quando tenho um UIButton - ou algum outro controle - hospedado em um UITableViewCell e quero que o usuário possa interagir com os controles, mas não com a própria célula.
NOTA : Como Tony Million observou acima, isso NÃO impedetableView:didSelectRowAtIndexPath:
. Eu contigo isso com simples declarações "if", na maioria das vezes testando a seção e evitando ações para uma seção específica.
Outra maneira que pensei em testar o toque de uma célula como esta é:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// A case was selected, so push into the CaseDetailViewController
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
// Handle tap code here
}
}
2.Para fazer isso em uma tabela inteira, você pode aplicar a solução acima a cada célula da tabela, mas também pode fazer isso:
[tableView setAllowsSelection:NO];
Nos meus testes, isso ainda permite que os controles internos UITableViewCell
sejam interativos.
3.Para tornar uma célula "somente leitura", você pode simplesmente fazer o seguinte:
[cell setUserInteractionEnabled:NO];
4.Para tornar uma tabela inteira "somente leitura"
[tableView setUserInteractionEnabled:NO];
5.Para determinar rapidamente se deve destacar uma célula (que de acordo com esta resposta inclui implicitamente a seleção), você pode implementar o seguinte UITableViewDelegate
método de protocolo:
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
tableView:shouldHighlightRowAtIndexPath:
, que geralmente é (nem sempre), minha abordagem preferida.
Para resumir o que acredito serem as respostas corretas com base em minha própria experiência na implementação disso:
Se você deseja desativar a seleção para apenas algumas das células, use:
cell.userInteractionEnabled = NO;
Além de impedir a seleção, isso também impede que tableView: didSelectRowAtIndexPath: seja chamado pelas células que o definiram. (Obrigado a Tony Million por esta resposta, obrigado!)
Se você possui botões nas células que precisam ser clicados, é necessário:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
e você também precisa ignorar todos os cliques na célula - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.
Se você deseja desativar a seleção para toda a tabela, use:
tableView.allowsSelection = NO;
(Crédito a Paulo De Barros, obrigado!)
A partir do iOS 6.0, UITableViewDelegate
tem tableView:shouldHighlightRowAtIndexPath:
. (Leia sobre isso na documentação do iOS .)
Esse método permite que você marque linhas específicas como não destacáveis (e implicitamente, não selecionáveis) sem precisar alterar o estilo de seleção de uma célula, interferindo no tratamento de eventos da célula userInteractionEnabled = NO
ou em qualquer outra técnica documentada aqui.
Você também pode desativar a seleção de linhas no próprio construtor de interfaces, escolhendo NoSelection
entre a selection
opção (de UITableView Properties) no painel do inspetor, conforme mostrado na imagem abaixo
SOLUÇÃO FIXA PARA SWIFT 3
cell.selectionStyle = .none
Se você deseja que a seleção pisque apenas, não permaneça no estado selecionado, você pode chamar, em
didSelectRowAtIndexPath
Os seguintes
[tableView deselectRowAtIndexPath:indexPath animated:YES];
para piscar o estado selecionado e reverter.
É isso que eu uso, ao cellForRowAtIndexPath
escrever este código .:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
No UITableViewDelegate
protocolo, você pode usar o método willSelectRowAtIndexPath
e, return nil
se não desejar, a linha selecionada.
Da mesma maneira, você pode usar o willDeselectRowAtIndexPath
método e, return nil
se não desejar, desmarcar a linha.
1 - Tudo o que você precisa fazer é definir o estilo de seleção naUITableViewCell
instância usando:
Objetivo-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
ou
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3:
cell.selectionStyle = .none
2 - Não implemente - tableView:didSelectRowAtIndexPath:
na exibição da tabela delegate
ou exclua explicitamente as células que você deseja que não executem nenhuma ação se você implementá-la.
3 - Além disso, você também pode fazer isso no storyboard. Clique na célula de exibição de tabela e, no inspetor de atributos, em Célula de exibição de tabela, altere a lista suspensa ao lado de Seleção para Nenhum.
4 - Você pode desativar o destaque da célula da tabela usando o código abaixo no (iOS) Xcode 9, Swift 4.0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
Abaixo do trecho, desative o destaque, mas também desative a chamada para didSelectRowAtIndexPath
. Portanto, se você não estiver implementando didSelectRowAtIndexPath
, use o método abaixo. Isso deve ser adicionado quando você estiver criando a tabela. Isso funcionará nos botões e UITextField
dentro da célula.
self.tableView.allowsSelection = NO;
Abaixo do trecho, desative o destaque e não desative a chamada para didSelectRowAtIndexPath
. Defina o estilo de seleção da célula como Nenhum emcellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
O snippet abaixo desativa tudo na célula. Isso irá desativar a interação com buttons
, textfields
:
self.tableView.userInteractionEnabled = false;
Abaixo estão o Swift
equivalente das Objective-C
soluções acima :
Substituição da primeira solução
self.tableView.allowsSelection = false
Substituição da segunda solução
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Substituição da Terceira Solução
self.tableView.userInteractionEnabled = false
Tente digitar:
cell.selected = NO;
Desmarcará sua linha quando necessário.
Em Swift3 ...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let r = indexPath.row
print("clicked .. \(r)")
tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}
Também tenho lutado com isso muito profusamente, tendo um controle na minha UITableViewCell
proibição do uso de userInteractionEnabled
propriedades. Eu tenho uma tabela estática de 3 células para configurações, 2 com datas, 1 com um botão liga / desliga. Depois de brincar no Storyboard / IB, consegui tornar a parte inferior não selecionável, mas quando você toca nela, a seleção de uma das linhas superiores desaparece. Aqui está uma imagem WIP das minhas configurações UITableView:
Se você tocar na terceira linha, nada acontecerá, a seleção permanecerá na segunda linha. A funcionalidade é praticamente uma cópia da tela de seleção do horário do evento do aplicativo Calendário da Apple.
O código é surpreendentemente compatível, até o IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
Isso funciona em conjunto com a definição do estilo de seleção como nenhum, para que a célula não pisque nos eventos de toque para baixo
Você só precisa colocar esse código em cellForRowAtIndexPath
Para desativar a propriedade de seleção da célula: (Ao tocar na célula).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Estou usando isso, o que funciona para mim.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Embora essa seja a melhor e mais fácil solução para impedir que uma linha mostre o destaque durante a seleção
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Gostaria de sugerir também que ocasionalmente seja útil mostrar brevemente que a linha foi selecionada e depois desativá-la. Isso alerta os usuários com uma confirmação do que eles pretendem selecionar:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Você também pode definir a cor de fundo como Limpar para obter o mesmo efeito UITableViewCellSelectionStyleNone
, caso não queira / não possa usar UITableViewCellSelectionStyleNone
.
Você usaria código como o seguinte:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Isso pode prejudicar seu desempenho, pois você adiciona uma exibição extra colorida a cada célula.
Você pode usar :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
na célula para a linha no método do caminho do índice do seu UITableView.
Também você pode usar:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
no modo de exibição de tableletrowatindexpath.
cell.selectionStyle = UITableViewCellSelectionStyle.none
em Swift 3.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Feliz codificação !!!
selection
e,highlighting
é claro, fica desabilitado com isso. Muitas respostas votadas explicam comodisable selection
e não abordam a desativaçãohighlighting
. Para desativar somente destacando o usocell.selectionStyle = .None
ou ir parastoryboard / cell / Selection = None