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?
ios
uitableview
cocoa-touch
DavidM
fonte
fonte
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
Respostas:
Para mim, o seguinte funcionou bem:
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" usandodidSelectRowAt#
.)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:fonte
selectionStyle
propriedade na célula:cell.selectionStyle = UITableViewCellSelectionStyle.None
em Swift oucell.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:
ou
Swift 2:
Swift 3 e 4.x:
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.Mais informações aqui e aqui
fonte
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:
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 impede
tableView: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 é:
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:
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:
4.Para tornar uma tabela inteira "somente leitura"
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:fonte
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:
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:
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:
(Crédito a Paulo De Barros, obrigado!)
fonte
A partir do iOS 6.0,
UITableViewDelegate
temtableView: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.fonte
Você também pode desativar a seleção de linhas no próprio construtor de interfaces, escolhendo
NoSelection
entre aselection
opção (de UITableView Properties) no painel do inspetor, conforme mostrado na imagem abaixofonte
SOLUÇÃO FIXA PARA SWIFT 3
fonte
Em seu
UITableViewCell
's XIB no atributo de valor Inspector conjunto deSelection
paraNone
.fonte
Se você deseja que a seleção pisque apenas, não permaneça no estado selecionado, você pode chamar, em
Os seguintes
para piscar o estado selecionado e reverter.
fonte
Caso alguém precise responder pelo Swift :
fonte
É isso que eu uso, ao
cellForRowAtIndexPath
escrever este código .:fonte
No
UITableViewDelegate
protocolo, você pode usar o métodowillSelectRowAtIndexPath
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.fonte
1 - Tudo o que você precisa fazer é definir o estilo de seleção na
UITableViewCell
instância usando:Objetivo-C:
ou
Swift 2:
Swift 3:
2 - Não implemente -
tableView:didSelectRowAtIndexPath:
na exibição da tabeladelegate
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
fonte
Objetivo-C:
Abaixo do trecho, desative o destaque, mas também desative a chamada para
didSelectRowAtIndexPath
. Portanto, se você não estiver implementandodidSelectRowAtIndexPath
, use o método abaixo. Isso deve ser adicionado quando você estiver criando a tabela. Isso funcionará nos botões eUITextField
dentro da célula.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
O snippet abaixo desativa tudo na célula. Isso irá desativar a interação com
buttons
,textfields
:Rápido:
Abaixo estão o
Swift
equivalente dasObjective-C
soluções acima :Substituição da primeira solução
Substituição da segunda solução
Substituição da Terceira Solução
fonte
Tente digitar:
Desmarcará sua linha quando necessário.
Em Swift3 ...
fonte
Também tenho lutado com isso muito profusamente, tendo um controle na minha
UITableViewCell
proibição do uso deuserInteractionEnabled
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 = /:
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
fonte
Podemos escrever código como
mas quando tivermos a célula personalizada xib acima da linha, avise nesse momento para
célula personalizada xib
precisamos definir o estilo de seleção None no construtor de interface
fonte
Você só precisa colocar esse código em cellForRowAtIndexPath
Para desativar a propriedade de seleção da célula: (Ao tocar na célula).
fonte
tente isso
e
e você também pode definir o estilo de seleção usando o interfacebuilder.
fonte
Estou usando isso, o que funciona para mim.
fonte
Embora essa seja a melhor e mais fácil solução para impedir que uma linha mostre o destaque durante a seleção
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:
fonte
Desativar diretamente o destaque do TableViewCell no storyboard
fonte
Para desativar o realce da célula UItableview
E não deve permitir que o usuário interaja com a célula.
fonte
Você também pode definir a cor de fundo como Limpar para obter o mesmo efeito
UITableViewCellSelectionStyleNone
, caso não queira / não possa usarUITableViewCellSelectionStyleNone
.Você usaria código como o seguinte:
Isso pode prejudicar seu desempenho, pois você adiciona uma exibição extra colorida a cada célula.
fonte
Você pode usar :
na célula para a linha no método do caminho do índice do seu UITableView.
Também você pode usar:
no modo de exibição de tableletrowatindexpath.
fonte
cell.selectionStyle = UITableViewCellSelectionStyle.none
em Swift 3.Você pode usar isso
fonte
Você pode usar ....
fonte
fonte
Feliz codificação !!!
fonte
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.
fonte