Escrevi minha própria função para rolar os campos de texto quando o teclado é exibido. Para descartar o teclado tocando fora do campo de texto, criei um UITapGestureRecognizer
que se encarrega de renunciar à primeira resposta no campo de texto ao tocar fora.
Agora também criei um preenchimento automático para o UITableView
campo de texto que cria um logo abaixo do campo de texto e o preenche com itens à medida que o usuário digita o texto.
No entanto, ao selecionar uma das entradas na tabela preenchida automaticamente, didSelectRowAtIndexPath
não é chamado. Em vez disso, parece que o reconhecedor de gestos de toque está sendo chamado e apenas renuncia ao atendedor de chamadas.
Acho que há uma maneira de dizer ao reconhecedor de gestos para continuar transmitindo a mensagem UITableView
, mas não consigo descobrir o que é. Qualquer ajuda será muito apreciada.
Respostas:
Ok, finalmente o encontrei após algumas pesquisas nos documentos do reconhecedor de gestos.
A solução foi implementar
UIGestureRecognizerDelegate
e adicionar o seguinte:Isso cuidou disso. Espero que isso ajude outras pessoas também.
fonte
return ![touch.view isKindOfClass:[UITableViewCell class]];
![touch.view isEqual: self.tableView] &&
antes do[touch.view isDescendantOfView: self.tableView]
para excluir otableView
próprio (porqueisDescendantOfView:
também retornaYES
se a exibição de argumento for a própria exibição do receptor). Espero que ajude outras pessoas que desejam o mesmo resultado.A maneira mais fácil de resolver esse problema é:
Isso permite
UIGestureRecognizer
reconhecer a torneira e também passar o toque para a próxima resposta. Uma consequência não intencional desse método é se você tiver umaUITableViewCell
tela que empurra outro controlador de exibição. Se o usuário tocar na linha para descartar o teclado, o teclado e o push serão reconhecidos. Duvido que seja isso que você pretende, mas esse método é adequado para muitas situações.Além disso, expandindo a resposta de Robert, se você tiver um ponteiro para a tableview em questão, poderá comparar diretamente sua classe em vez de ter que converter para uma string e esperar que a Apple não mude a nomenclatura:
Lembre-se, você também deve declarar
UIGestureRecognizer
ter um delegado com esse código.fonte
isDescendantOfView
vez de apenas verificar se o valorclass
é igual, pois você pode estar tocando em uma subvisão. Depende do que você precisa.Conjunto
cancelsTouchesInView
do seu reconhecedor como false. Caso contrário, ele "consome" o toque por si próprio e não o repassa para a visualização da tabela. É por isso que o evento de seleção nunca acontece.por exemplo em
swift
fonte
E para Swift (com base na resposta de @Jason):
fonte
Talvez eu tenha uma solução melhor para adicionar um gesto de toque em uma exibição de tabela, mas permitindo a seleção de células ao mesmo tempo:
Eu apenas procuro uma célula no ponto da tela em que o usuário está tocando. Se nenhum caminho do índice for encontrado, deixo o gesto receber o toque, caso contrário eu o cancelo. Para mim, funciona muito bem.
fonte
Eu acho que não há necessidade de blocos de escrita de códigos simplesmente definidas
cancelsTouchesInView
parafalse
o seu objeto gesto, por padrão ele étrue
e você apenas tem que configurá-lofalse
. Se você estiver usando umUITapGesture
objeto no seu código e também usandoUIScrollView
(tableview, collectionview), defina esta propriedadefalse
fonte
Uma solução semelhante é implementar
gestureRecognizer:shouldReceiveTouch:
usando a classe da exibição para determinar qual ação executar. Essa abordagem tem a vantagem de não mascarar os toques na região diretamente ao redor da tabela (as visualizações dessa área ainda descendem das instâncias do UITableView, mas elas não representam células).Isso também tem o bônus de funcionar com várias tabelas em uma única exibição (sem adicionar código extra).
Advertência: existe uma suposição de que a Apple não alterará o nome da classe.
fonte
return ![[touch.view.superview class] isSubclassOfClass:[UITableViewCell class]];
Para o Swift 4.2, a solução foi implementar
UIGestureRecognizerDelegate
e adicionar o seguinte:quando você clica na exibição de tabela, esse método delegado retorna falso e o
didSelectRowAtIndexPath
método da exibição de tabela está funcionando corretamente.fonte
Eu tive uma situação diferente em que queria que a função de gesto de toque fosse chamada apenas quando o usuário tocou fora da visualização da tabela. Se o usuário tocou na visualização da tabela, a função de gesto de toque não deve ser chamada. Além disso, se a função de gesto de toque for chamada, ela ainda deve passar o evento de toque para a exibição que foi tocada em vez de consumi-lo.
O código resultante é uma combinação da resposta de Abdulrahman Masoud e a resposta de Nikolaj Nielsen.
E na
MyViewController
classe, a classe que tem oUITableView
, noonViewDidLoad()
, fiz questão de chamaraddGestureRecognizer()
:fonte
Basta definir
cancels touches in view
afalse
para qualquer gesto debaixo da(table/collection)View
:- Interfacebuilder
- Código
fonte
Embora seja tarde e muitas pessoas achem que as sugestões acima funcionam bem, não consegui que os métodos de Jason ou TMilligan funcionassem.
Eu tenho um tableView estático com várias células contendo textFields que recebem entradas de número usando apenas o teclado numérico. Isso foi ideal para mim:
Verifique se você implementou isso
<UIGestureRecognizerDelegate>
no seu arquivo .h.Essa linha
![touch.view isKindOfClass:[UITableViewCell class]]
verifica se um tableViewCell foi tocado e descarta qualquer teclado ativo.fonte
A solução simples é usar instâncias UIControl no UITableViewCell para obter retoques. Você pode adicionar visualizações com userInteractionEnables == NO no UIControl para obter toques.
fonte
Aqui está minha solução, que vincula o shouldReceiveTouch do reconhecedor diretamente ao fato de o teclado estar aparecendo.
No seu delegado reconhecedor de gestos de toque:
E o
PFXKeyboardStateListener.h
:E o
PFXKeyboardStateListener.m
:Você pode atualizar o padrão singleton do ouvinte de teclado, ainda não cheguei a ele. Espero que isso funcione para todos os outros, assim como para mim. ^^
fonte
Implemente este método para delegar UIGestureRecognizer:
fonte
No Swift você pode usar isso dentro
fonte
Meu caso foi diferente, incluindo uma uisearchbar e uitableview no self.view. Eu queria descartar o teclado da uisearchbar tocando na visualização.
Nos métodos de delegação UISearchBar:
Quando o usuário toca em self.view:
fonte
Swift 5, maio de 2020.
Eu tenho um textField e um tableView que fica visível quando insiro o texto.
Estado inicial Então, eu quero 2 eventos diferentes quando toco em tableViewCell ou algo mais.
O teclado e o tableView estão sendo mostrados
Primeiro, adicionamos tapGestureRecognizer.
Em seguida, adicionamos a seguinte verificação no UIGestureRecognizerDelegate:
}
Se eu quiser ocultar o teclado primeiro, o tableView permanecerá visível e responsivo aos meus toques.
insira a descrição da imagem aqui
fonte
Esta é a minha solução com base nas respostas acima ... Funcionou para mim ...
fonte
PROBLEMA: No meu caso, o problema era que eu originalmente coloquei um botão em cada célula collectionView e defini as restrições para preencher a célula, de modo que, quando a célula fosse clicada, ela clicaria no botão, no entanto, a função dos botões estava vazia e nada estava parece estar acontecendo.
CORRECÇÃO: Corrigi isso removendo o botão da célula de exibição de coleção.
fonte