UITableView didSelectRowAtIndexPath: não sendo chamado no primeiro toque


352

Estou com um problema UITableView's didSelectRowAtIndexPath.

Minha tabela está configurada para que, quando eu selecionar linha, inicialize um novo controlador de exibição e o empurre.

Na primeira vez que toco em qualquer linha da tabela, o método não é chamado. Depois de selecionar outra linha, ela começa a funcionar normalmente.

Eu verifiquei isso definindo um ponto de interrupção em didSelectRowAtIndexPath. Ao adicionar um NSLogao método, vejo que, quando seleciono a segunda linha que finalmente empurra o novo controlador de exibição, vejo duas instruções de log sendo exibidas no console ao mesmo tempo.

Alguma sugestão?


2
Você pode postar seu código tableView:didSelectRowAtIndexPath:?
precisa saber é o seguinte

Eu tive o mesmo problema, verifique a minha resposta: stackoverflow.com/a/44097559/1600061
Zsivics Sanel

11
O envio na fila principal resolveu meu problema stackoverflow.com/questions/20149167/…
durgeshtrivedi

Respostas:


1356

Alguma chance de você digitar acidentalmente De selectRowAtIndexPath?


17
@ Dschee não é chamado na primeira torneira porque você não está desmarcando nada. Depois de selecionar uma linha, quando você tenta selecionar uma segunda, a primeira fica desmarcada.
O cara

19
É por isso que eu amo tanto.
elbuild

4
Votei isso não porque cometi esse erro uma vez. Votou porque cometi esse erro nada menos que 4 vezes em apenas dois anos, custando tanto tempo.
Brooks Hanes

8
AMD!! Este pode ser o pior bug que introduzi no meu código.
Shantanu Paul

4
UAU. Economizou muito tempo.
precisa saber é o seguinte

24

Verifique também a propriedade de seleção da sua visualização de tabela no arquivo xib. Use 'Seleção Única' ou 'Seleção Múltipla', conforme necessário.


2
Ba ha ha ha! Uau, eu passei 4 horas tentando descobrir isso. @includeMe ao resgate (saudação)! Obrigado!

17

Tive o seguinte problema:

  • primeiro toque na linha -> sem efeito, sem seleção, nunca
  • segundo toque e depois -> comportamento de seleção correto, sempre

No meu caso, meu erro foi verificar Show Selection on Touchno Interface Builder. Você pode desmarcar no IB aqui:

insira a descrição da imagem aqui

Espero que ajude alguém


Você é meu herói! Alguma idéia de por que esse é o padrão? Não consigo pensar em nenhum aplicativo com esse comportamento e acho que esse é um padrão muito estranho.
Christophe Fondacci

12

Marque Se você definiu algum reconhecedor de gestos em sua classe. Remover o gesto funcionou para mim.


Eu tenho ambos; Reconhecedor de gestos e didSelectRowAtIndexPath? No entanto, sempre o reconhecedor de gestos tem preferência. Não foi possível chegar ao segundo. Existe uma maneira de lidar com ambos ou eu tenho que me livrar do reconhecedor de gestos? Obrigado!
Ron

isso deve estar no topo :) me custou 1 hora após 7 anos no desenvolvimento do iOS.
Palhaço

6

Eu debati até postar essa resposta porque acho que as estrelas se alinharam para que isso se manifestasse.

Estou tendo uma variação desse problema e verifiquei as outras soluções. Na minha exibição de tabela, ele não está processando a última linha da minha tabela no primeiro toque. Isso destaca, mas didSelectRowAtIndexPathnão está sendo chamado. Todas as outras linhas funcionam bem. Mas se eu ativar o retorno da tableview, parece que ele resolverá o problema (mas você precisará lidar com o retorno da tableview).


Você encontrou a razão pela qual isso está acontecendo? Eu tenho exatamente a mesma questão. Quando desativo o salto da tabela, a primeira / última linha da tabela não reage no primeiro toque. Eu pensei que era bug, mas já faz mais de um ano e ainda está acontecendo.
Filip.karas

Não. Eu apenas liguei o salto da tableview e deixei por isso mesmo.
Perseguição Roberts

Estou tendo esse problema apenas em um iPhone 5 (iOS 10.3) - ativar o retorno no tableview o corrigiu. Muito estranho!
Lee Probert

4

UITableViewCellSelectionStyleNone foi definido para a célula que exibe esse problema (ios9).

Acabei ligando

[tableView deselectRowAtIndexPath:indexPath animated:NO];

primeira coisa em

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

o que não é o mesmo, mas é bom o suficiente. me faz pensar que tipo de quebra de mesa o ios10 traz.


Isso funcionou para mim, mas preciso de uma solução alternativa para ocultar a seleção sem criar seu estilo Nenhum. Eu fiz override setSelectedmas enquanto o usuário está segurando o celular, aparece selecção que não é aceitável
MMujtabaRoohani

1

SWIFT 2

Verifique se você definiu como verdadeiro:

self.tableView.allowsSelection = true

Coloque isso acima do seu direito, depois viewDidLoad()e antes dosuper.viewDidLoad()


1

SWIFT 3

Se você estiver trabalhando com o Swift 3 em uma classe que não seja UITableViewControllere estiver usando UITableViewDelegate, poderá ser necessário usar o título do método:

@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}

Isso funcionou para mim, embora eu tenha acabado de migrar meu projeto para o Swift 3. É relativamente novo, então isso pode ser corrigido mais tarde.


1

Se você configurou qualquer UITapGestureRecognizer em sua classe, poderá adicionar esta linha ao seu didSelectRowAtIndexPath:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

Isso funcionou para mim.


1

este problema acontece também quando você está trabalhando com gesto reconhecedor dentro de um tableView neste caso, você não precisa removê-los, você só precisa ter certeza de que sua propriedade gesto cancelsTouchesInView = falseeste é um valor booleano que afetam se toques são entregues a uma visão quando um gesto é reconhecido.


0

SWIFT 3

Nenhuma das outras respostas funcionou no meu caso, o que foi corrigido para mim foi:

tableView.delaysContentTouches = false


0

didSelectRowAtfunção não foi chamada no meu aplicativo no primeiro ou segundo toque ... Eu estava tentando resolver o problema não conseguiu encontrar nenhuma solução. Mas de repente eu reconheci, estava usando o view.animation color change ... o Delegatemétodo não foi chamado enquanto a animação persistia


0

No meu caso, eu tinha um cabeçalho de seção UITableView com um reconhecedor de gestos. Quando o cabeçalho é tocado, ele deve inserir algumas linhas nessa seção e animar a inserção (como expandir / recolher seção). Na primeira vez em que foi expandido e tocado, o método delegado didSelectRow não foi acionado. Para mais toques e ações de expansão / recolhimento, estava funcionando conforme o esperado.

Por resposta de @Ayoub Nouri, definai cancelsTouchesInView como false, e isso resolveu o problema. tapGestureRecognizer? .cancelsTouchesInView = false


0

Swift 4.2

A desativação do "Atraso no toque para baixo" no inspetor de atributos resolveu o problema.
Depois disso, os cliques são suaves e o didSelectRowAt é acionado imediatamente.

Inspetor de atributos XCode


0

O que funcionou para mim foi começar a digitar "didSelect ..." e depois deixar a correção automática preencher o restante. Aparentemente, alguns detalhes da minha sintaxe eram instáveis. Como outros já disseram, use o IDE !!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.