Pergunta

Eu estou escrevendo um app iOS com uma exibição de tabela dentro de uma visão guia. Na minha UITableViewController, implementei -tableView:didSelectRowAtIndexPath:, mas quando eu selecionar uma linha em tempo de execução, o método não está sendo chamado. A exibição de tabela está sendo preenchido, então eu sei que outros métodos TableView em meu controlador estão sendo chamados.

Alguém tem alguma idéia do que eu possa ter asneira de fazer isso acontecer?

Foi útil?

Solução

Parece que talvez a classe não é o UITableViewDelegate para essa exibição de tabela, embora UITableViewController é suposto conjunto que automaticamente.

Qualquer chance que você redefinir o delegado para alguma outra classe?

Outras dicas

Apenas no caso de alguém cometeu o mesmo erro estúpido como eu fiz:

Verifique se o nome do método do que você espera de ser didSelect pode acidentalmente ser obtido didDeselect de alguma forma. Demorou cerca de duas horas para eu descobrir ...

tipo de seleção

Outra coisa que pode levar a que a questão não for selecionado:

UITableView tipo selecção

Deve ser Single Selection para a seleção normal, deve não ser No Selection.

Outra possibilidade é que a UITapGestureRecognizer poderia estar comendo os eventos, como foi o caso aqui: https://stackoverflow.com/a / 9248827/214070

Eu não suspeitar esta causa, porque as células da tabela ainda destacar azul como se as torneiras foram passar.

Todas as respostas boas, mas há mais um olhar para fora ...

(especialmente quando a criação de um UITableView programaticamente)

Verifique se o tableView pode responder à seleção, definindo [tableView setAllowsSelection:YES]; ou remover qualquer linha que define como NO.

Se o problema ocorrer com UITapGestureRecognizer você pode corrigir isso:

  • em Storyboard:

enter descrição da imagem aqui

no código com Objective-C:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

no código com Swift:

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false

Eu encontrei duas coisas nessas situações.

  1. Você pode ter esqueceu de implementar protocolo UITableViewDelegate, ou não há nenhuma tomada de delegação entre a sua classe e sua exibição de tabela.

  2. Você pode ter um UIView dentro de sua linha que é um socorrista e leva seus cliques de distância. Digamos que uma UIButton ou algo similar.

Eu tive o mesmo problema. E era difícil de encontrar. Mas em algum lugar no meu código foi o seguinte:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return nil;
}

Deve ser return indexPath, outra -tableView:didSelectRowAtIndexPath: não está sendo chamado.

Se você adicionou um GestureRecognizer no topo do UITableView, didSelectRowAtIndexPath não são chamados.

Então, você precisa usar o método delegado GestureRecognizer ao toque evitar particularmente vista.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}

Eu corri em um problema onde depois de meses de não olhar para o meu código que eu esqueci que eu implementado o seguinte método devido a alguns requisitos que não eram necessárias

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath  *)indexPath{
    return NO;
}

Deve voltar SIM para uma linha, a fim de torná-lo selecionado.

Você deve selecionar estas opções

enter descrição da imagem aqui

mas se você quiser fazer UITableViewnot realçado na clicando então você deve fazer mudanças nas propriedades UITableViewCell.

Escolha Nenhum opção para seleção como abaixo

enter descrição da imagem aqui

Eu tinha colocado um UITapGestureRecognizer no meu ponto de vista tabela para dispensar o teclado que impediu didSelectRowAtIndexPath: de ser chamado. Espero que ajude alguém.

No caso de você ter o mesmo problema que eu: Aparentemente, este método não será chamado se sua tableView está em modo de edição. Você tem que definir allowsSelectionDuringEditing para true.

Por esta pergunta: Ao editar, `UITableView` não chama didSelectRowAtIndexPath ??

Eu tive o mesmo problema,

A razão estava usando de UITapGestureRecognizer. Eu queria que o teclado para descartar quando eu bati em qualquer outro lugar. Percebi que isso substitui todas as ações da torneira, por isso, a função didSelectRowAtIndexPath não ligou.

Quando eu comentar as linhas relacionadas com UITapGestureRecognizer, ele funciona. Além disso, você pode verificar na função de UITapGestureRecognizer selector se o aproveitado é UITableViewCell ou não.

Para Xcode 6.4, 1.2 Swift. A seleção "tag" tinha sido mudado em IB. Eu não sei como e porquê. Definindo-o como "Seleção Individual" feito minhas células visualizar a tabela selecionáveis ??novamente. enter descrição da imagem aqui

No meu caso, didSelctRowAtIndexPath não chamar é devido a que eu tenha selecionado nenhum na Seleção propriedade de tableView, definido como seleção única resolveu o meu problema

 enter descrição da imagem aqui

Mesmo que outra resposta foi aceite, vou acrescentar mais um possível problema e solução para as pessoas que observam esse problema:

Se você tem contagem de referência automático (ARC) ligado, você pode descobrir que, mesmo depois de atribuir o controlador como um delegado da visão, as mensagens da vista para o controlador não estão sendo recebidos porque ARC está excluindo o controlador. Aparentemente ponteiro delegado do UITableView não conta como uma referência para a ARC, por isso, se essa é a única referência a ele, o controlador será dealloc'd. Você pode verificar se este está acontecendo através da aplicação do método dealloc no controlador e definir um ponto de interrupção ou chamada NSLog lá.

A solução é manter o controle do controlador com uma referência forte em outro lugar, até ter certeza de que você não vai precisar dele mais.

Lembre-se de definir a fonte de dados e delegar no método viewDidLoad como segue:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

Meu problema era nenhuma das opções acima. E assim coxo. Mas eu pensei que eu iria listar-lo aqui no caso de ajuda de alguém.

Eu tenho um tableViewController que é o meu controlador de "base" e então eu criar subclasses deste controlador. Eu estava escrevendo todo o meu código na rotina tableView:didSelectRowAtIndexPath na classe "base". Esquecendo completamente que, por padrão esta rotina também tinha sido criado (embora com nenhum código que fez qualquer coisa) em todas as minhas subclasses também. Então, quando eu corri meu aplicativo, ela correu a versão subclasse do código, não fez nada, e me deixou triste. Então, é claro, uma vez que eu removi a rotina das subclasses, usou mt "base" de rotina classe e estou no negócio.

Eu sei. Não ria. Mas talvez isso irá salvar alguém a hora eu perdi ...

Dando meus 2 centavos sobre isso.

Eu tinha um UITableViewCell personalizado e havia um botão cobrindo toda a célula, por isso, quando o toque aconteceu, o botão foi selecionado e não a célula.

De qualquer remover o botão ou no meu caso, eu set usuário Interação Ativar para false no botão, de que maneira a célula foi o selecionado.

Se você lê este, por isso ainda não resolve o problema.

Eu tenho costume célula, onde opção " usuário Interação Ativado " foi desactivado. Então, eu só ligar-lo. Boa sorte.

Eu só tinha isso e como aconteceu a mim no trabalho passado isso não aconteceu porque eu não prestar atenção ao autocomplete ao tentar adicionar o método e eu realmente acabar implementação tableView:didDeselectRowAtIndexPath:. Em vez de tableView:didSelectRowAtIndexPath:

Eu sei que é velho e o problema foi resolvido, mas um teve problema semelhante, eu pensei que o problema era com o meu costume UITableViewCell, mas a solução era completamente diferente - eu reiniciar XCode :) e, em seguida, funciona ok! quase como o Windows:)

Se a sua exibição de tabela está no modo de edição (ex. [tableView setEditing:YES animated:NO];), você precisa conjunto tableView.allowsSelectionDuringEditing = YES;

Certifique-se de que você implementou tableView:didSelectRowAtIndexPath e não tableView:didDeSelectRowAtIndexPath

Isto é conseguido me em mais de algumas ocasiões !!

Outro erro que você poderia ter feito (como eu fiz): se você definir um segue na célula, didSelectRowAtIndexPath não é chamado. Você deve definir seus segues no controlador de vista em vez.

Nenhuma dessas respostas funcionou para mim. Após cerca de uma hora, eu descobri algo muito insidiosa:

Eu tenho uma exibição de tabela dentro de uma célula de outra exibição de tabela. Eu decidi fazer uma visão de inclusão que contém a exibição tabela interna, entre outras coisas. Chamei essa visão contentView e conectei na xib.

Acontece que UITableViewCell já tem um contentView e faz coisas estranhas com ele. A questão resolveu-se quando eu renomeado a propriedade para mainContentView e reconectado a visão para esta propriedade renomeado.

No meu caso, eu calcular dinamicamente a altura de TableView do SuperView no tempo de carregamento. Devido a um erro de cálculo, o TableView foi posicionado fora do SuperView. O TableView foi tirada bem, no entanto toda a interação foi desativado (e didSelectRowAtIndexPath nunca foi chamado). Muito difícil de detectar, já que não há nenhuma indicação visual de que o TableView não é "acessível".

No meu caso a solução foi mudar NO para YES no abaixo função.

iOS 9 +

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

Ok, atualizando aqui como eu apenas corri para este problema, e meu problema foi um pouco diferente do que o encontrado aqui.

Eu olhei no IB e vi que meu delegado foi definido, mas foi configurado incorretamente para ver em vez de proprietário do arquivo (clique direito sobre exibição de tabela para ver onde delegado está apontando para).

Espero que ajude alguém

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top