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.