Estou escrevendo um aplicativo para iOS com uma visualização de tabela em uma visualização de guia. No meu UITableViewController
, eu implementei -tableView:didSelectRowAtIndexPath:
, mas quando seleciono uma linha em tempo de execução, o método não está sendo chamado. A visualização de tabela está sendo preenchida, portanto, eu sei que outros métodos tableView no meu controlador estão sendo chamados.
Alguém tem alguma idéia do que eu possa ter estragado para fazer isso acontecer?
ios
uitableview
cocoa-touch
didselectrowatindexpath
Matt Pfefferle
fonte
fonte
UITableView
?-didSelectRowAtIndexPath
. Eu descobri o chapéu, porque tenho um reconhecedor de gestos na tela e o gesto precisa falhar antes de receber o toque. Embora seja estranho, a animação de seleção de tabela não é afetada pelo reconhecedor de gestos.Respostas:
Parece que talvez a classe não seja a
UITableViewDelegate
da exibição de tabela, embora devaUITableViewController
definir isso automaticamente.Alguma chance de você redefinir o delegado para outra classe?
fonte
Apenas no caso de alguém cometer o mesmo erro estúpido que eu:
Verifique se o nome do método que você espera ser
didSelect
acidentalmente pode ser obtidodidDeselect
de alguma forma. Demorou cerca de duas horas para eu descobrir ...fonte
Outra coisa que pode levar ao problema não é o tipo de seleção selecionado:
Deve ser
Single Selection
para seleção normal, não deve serNo Selection
.Para fazer isso programaticamente, faça:
fonte
Outra possibilidade é que um UITapGestureRecognizer possa estar comendo os eventos, como foi o caso aqui: https://stackoverflow.com/a/9248827/214070
Não suspeitei dessa causa, porque as células da tabela ainda destacariam o azul como se as torneiras estivessem passando.
fonte
didSelectRowAtIndexPath
, não funciona apenas após excluir a célulacommitEditingStyle
. Então eu façoUITapGestureRecognizer
etapAction:
tenhoindexPath
desender.view
([self.tableView indexPathForCell:sender.view]
) e chamada[self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]
Todas as boas respostas, mas há mais uma a procurar ...
(Principalmente ao criar um UITableView programaticamente)
Verifique se o tableView pode responder à seleção definindo
[tableView setAllowsSelection:YES];
ou removendo qualquer linha que a definaNO
.fonte
setAllowsSelectionDuringEditing:
à lista (quando tableview está no modo de edição)Single Selection
.Se o problema surgir,
UITapGestureRecognizer
você pode corrigir isso:em código com
Objective-C
:em código com
Swift
:fonte
Eu encontrei duas coisas nessas situações.
Você pode ter se esquecido de implementar o protocolo UITableViewDelegate ou não há saída de delegação entre sua classe e sua exibição de tabela.
Você pode ter um UIView em sua linha que é o primeiro a responder e retira seus cliques. Diga um UIButton ou algo semelhante.
fonte
Eu tive o mesmo problema. E foi difícil de encontrar. Mas em algum lugar do meu código estava este:
Deve ser
return indexPath
, caso contrário,-tableView:didSelectRowAtIndexPath:
não está sendo chamado.fonte
Se você adicionou um gestoRecognizador na parte superior do UITableView,
didSelectRowAtIndexPath
não será chamado.Portanto, você precisa usar o método de delegação gestRecognizer para evitar o toque em uma exibição específica.
fonte
if ([touch.view isDescendantOfView:YourTable])
Eu encontrei um problema em que, depois de meses sem olhar para o meu código, esqueci que implementei o método a seguir devido a alguns requisitos que não eram necessários
Ele deve retornar SIM para uma linha para torná-la selecionada.
fonte
VOCÊ DEVE selecionar essas opções
mas se você não deseja
UITableView
destacar o clique, faça alterações nasUITableViewCell
propriedades.Escolha a opção Nenhum para a seleção, como abaixo
fonte
Eu tinha colocado uma
UITapGestureRecognizer
visão na minha mesa para descartar o teclado que impediadidSelectRowAtIndexPath:
de ser chamado. Espero que ajude alguém.fonte
Caso você tenha o mesmo problema que eu: Aparentemente, esse método não será chamado se o seu tableView estiver no modo de edição. Você deve definir o allowSelectionDuringEditing como true.
Através desta pergunta: Ao editar, o `UITableView` não chama didSelectRowAtIndexPath ??
fonte
Eu tive o mesmo problema,
O motivo foi o uso de
UITapGestureRecognizer
. Eu queria que o teclado fosse descartado quando toquei em qualquer outro lugar. Percebi que isso substitui todas as ações de toque, por isso adidSelectRowAtIndexPath
função não foi chamada.Quando eu comento as linhas relacionadas
UITapGestureRecognizer
, ele funciona. Além disso, você pode verificar se a funçãoUITapGestureRecognizer selector
tocada éUITableViewCell
ou não.fonte
No meu caso, didSelctRowAtIndexPath não chamando deve-se ao fato de eu ter selecionado nenhum na propriedade Selection do tableView, definido como a seleção única, resolvido o meu problema
fonte
Para o Xcode 6.4, Swift 1.2. A seleção "tag" foi alterada no IB. Não sei como e por quê. Configurá-lo para "Seleção única" tornou minhas células de exibição de tabela selecionáveis novamente.
fonte
Mesmo que outra resposta tenha sido aceita, adicionarei mais um possível problema e solução para as pessoas que observam esse problema:
Se você tiver a contagem automática de referência (ARC) ativada, poderá descobrir que, mesmo depois de atribuir seu controlador como delegado da exibição, as mensagens da exibição para o controlador não serão recebidas porque o ARC está excluindo o controlador. Aparentemente, o ponteiro delegado do UITableView não conta como referência para o ARC; portanto, se essa for a única referência a ele, o controlador será desalocado. Você pode verificar se isso está acontecendo ou não, implementando o método dealloc no controlador e definindo um ponto de interrupção ou chamada NSLog lá.
A solução é acompanhar o controlador com uma referência forte em outro lugar, até que você tenha certeza de que não precisará mais dele.
fonte
Lembre-se de definir a fonte de dados e delegar no método viewDidLoad da seguinte maneira:
fonte
Meu problema não foi nenhum dos itens acima. E tão coxo. Mas pensei em listá-lo aqui, caso isso ajude alguém.
Eu tenho um
tableViewController
que é meu controlador "base" e, em seguida, crio subclasses desse controlador. Eu estava escrevendo todo o meu código natableView:didSelectRowAtIndexPath
rotina na classe "base". Esquecendo completamente que, por padrão, essa rotina também havia sido criada (embora sem código que fizesse alguma coisa) em todas as minhas subclasses também. Então, quando eu executei meu aplicativo, ele executou a versão da subclasse do código, não fez nada e me deixou triste. Então, é claro, depois que removi a rotina das subclasses, ele usou a rotina de classe mt "base" e estou no negócio.Eu sei. Não ria Mas talvez isso poupe a alguém a hora que perdi ...
fonte
Dando meus 2 centavos nisso.
Eu tinha um UITableViewCell personalizado e havia um botão cobrindo a célula inteira; portanto, quando o toque aconteceu, o botão foi selecionado e não a célula.
Remova o botão ou, no meu caso, defino a Interação do usuário ativada como false no botão, dessa forma a célula foi a selecionada.
fonte
Se você ler isso, ainda assim não resolve o problema.
Eu tenho uma célula personalizada , onde a caixa de seleção " Interação do usuário ativada " foi desativada. Então, eu apenas ligo. Boa sorte.
fonte
Acabei de ter isso e, como aconteceu comigo no passado, não funcionou porque não prestei atenção ao preenchimento automático ao tentar adicionar o método e acabei implementando
tableView:didDeselectRowAtIndexPath
: em vez detableView:didSelectRowAtIndexPath:
.fonte
Certifique-se de implementar
tableView:didSelectRowAtIndexPath
e nãotableView:didDeSelectRowAtIndexPath
Isso me pegou em mais de algumas ocasiões !!
fonte
Eu sei que é antigo e o problema foi resolvido, mas tive um problema semelhante, pensei que o problema estava com meu UITableViewCell personalizado, mas a solução era completamente diferente - eu reinicio o XCode :) e depois funciona ok! quase como o Windows :)
fonte
Se a visualização da tabela estiver no modo de edição (por exemplo
[tableView setEditing:YES animated:NO];
), é necessário definirtableView.allowsSelectionDuringEditing = YES;
fonte
Outro erro que você poderia ter cometido (como eu fiz): se você definir um segue na célula,
didSelectRowAtIndexPath
não será chamado. Você deve definir seus segues no controlador de exibição.fonte
Nenhuma dessas respostas funcionou para mim. Após cerca de uma hora, descobri algo muito traiçoeiro:
Eu tenho uma exibição de tabela dentro de uma célula de outra exibição de tabela. Decidi fazer uma visão anexa que contenha a visão interna da tabela, entre outras coisas. Chamei essa visualização de contentView e liguei-a no xib.
Acontece que o UITableViewCell já tem um contentView e faz coisas estranhas com ele. O problema foi resolvido quando eu renomeei a propriedade para mainContentView e reconecte a exibição a essa propriedade renomeada.
fonte
No meu caso, eu dinamicamente calcular a altura de os
TableView
'sSuperView
no momento do carregamento. Devido a um erro de cálculo, oTableView
foi posicionado fora doSuperView
. A opçãoTableView
foi selecionada, no entanto, toda a interação foi desativada (edidSelectRowAtIndexPath
nunca foi chamada). Muito difícil de detectar, pois não há indicação visual de que oTableView
item não seja "acessível".fonte
No meu caso, o problema era que eu tinha uma
UITableViewCell
subclasse e havia implementado esses dois métodos:touchesBegan:withEvent:
&touchesEnded:withEvent
para lidar com uma animação sofisticada ao toque. Mas eu tinha esquecido de adicionar o[super touchesBegan:touches withEvent:event];
anúncio de método[super touchesEnded:touches withEvent:event];
para também informar o pai da célula sobre o toque.Então, alterar o código para o seguinte resolveu meu problema:
fonte
No meu caso, a solução foi alterar NÃO para SIM na função abaixo.
iOS 9 ou superior
fonte