Eu tenho um UITableView
com UITextField
s como células. Eu gostaria de descartar o teclado quando o fundo do UITableView
for tocado. Estou tentando fazer isso criando um UIButton
tamanho de UITableView
e colocando-o atrás de UITableView
. O único problema é UIButton
capturar todos os toques, mesmo quando o toque está no UITableView. O que estou fazendo de errado?
Obrigado!
ios
uitableview
uikeyboard
Hua-Ying
fonte
fonte
Respostas:
Isso é feito facilmente criando um UITapGestureRecognizer objeto (por padrão, isso detectará um "gesto" em um único toque, então nenhuma personalização adicional é necessária), especificando um alvo / ação para quando o gesto é disparado e, em seguida, anexando o objeto reconhecedor de gesto para a visualização da sua mesa.
Por exemplo, talvez em seu
viewDidLoad
método:E o
hideKeyboard
método pode ser assim:Observe que o gesto não é disparado ao tocar dentro de um
UITextField
objeto. Ele é disparado no plano deUITableView
fundo, visualização de rodapé, visualização de cabeçalho e emUILabels
células internas, etc.fonte
gestureRecognizer.cancelsTouchesInView = NO;
hideKeyboard
método, em vez de se comunicar diretamente com os campos de texto, você pode fazer[self.view endEditing:NO];
. Dos documentos da Apple: " Este método analisa a visão atual e sua hierarquia de subvisualização para o campo de texto que é atualmente o primeiro respondente. Se encontrar um, ele pede que esse campo de texto renuncie como primeiro respondente. Se o parâmetro force for definido como SIM, o campo de texto nunca é perguntado; ele é forçado a renunciar. "A solução UITapGestureRecognizer funciona com a seleção de células da tabela se você definir:
fonte
shouldReceiveTouch
Esta é a melhor maneira de fazer isso. Apenas faça isso
ou
fonte
Você também pode fazer isso no Storyboard:
fonte
Como
UITableView
é uma subclasse deUIScrollView
, implementar um método delegado abaixo fornece uma solução extremamente fácil e rápida. Não há necessidade de se envolver,resignFirstResponder
já que a hierarquia de visualização examina e encontra o respondente atual e pede que ele renuncie ao status de respondente.E lembre-se de adicionar
UIScrollViewDelegate
ao arquivo de cabeçalho.fonte
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
Em primeiro lugar, escute
scrollViewWillBeginDragging
em seuUIViewController
adicionandoUIScrollViewDelegate
:No arquivo .h:
No arquivo .m:
Em seguida, ouça outras interações:
Em seguida, implemente
dismissKeyboard
:E se, como eu, você quiser dispensar o teclado para um UITextField dentro de uma célula de tabela personalizada:
Espero que ajude quem está procurando !!
fonte
fonte
Esta é a versão rápida para seu prazer de codificação:
Ele adiciona um reconhecedor de gestos de toque e, em seguida, descarta o teclado. Nenhuma saída para o TextField é necessária!
fonte
Existe a versão Swift 3 sem bloqueio de torneiras nas células.
No
viewDidLoad()
método:E
hideKeyboard
fica assim:fonte
Eu fiz assim:
Crie um método em seu TableViewController para desativar o primeiro respondente (que seria seu TextBox nesse ponto)
Na
tableView:didSelectRowAtIndexPath:
chamada do método anterior:fonte
didSelectRowAtIndexPath
não dispara se você tocar no próprio TableView.Eu tive um
UITableViewController
e implementartouchesBegan:withEvent:
não funcionou para mim.Aqui está o que funcionou:
Rápido:
Objective-C:
fonte
Em seguida, certifique-se de que em seu arquivo Nib você definiu o tipo de seu UITableView como DismissableUITableView ... talvez eu pudesse ter pensado em um nome melhor para esta classe, mas você entendeu.
fonte
Se você tem como alvo o iOS7, pode usar um dos seguintes:
O primeiro animará o teclado fora da tela quando a visualização da mesa for rolada e o último ocultará o teclado como o aplicativo de mensagens de estoque.
Observe que estes são de
UIScrollView
, queUITableView
herda de.fonte
Experimente isto:
fonte
UITableView é uma subclasse de UIScrollView.
A maneira como fiz isso foi ouvir um evento de rolagem do usuário e, em seguida, resignFirstResponder. Aqui está o método UIScrollViewDelegate para implementar em seu código;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
Ao abordar esses tipos de problemas, descobri que a melhor maneira é pesquisar os protocolos delegados para cada objeto e aqueles das classes pai (neste caso UITableViewDelegate, UIScrollViewDelegate. O número de eventos que os objetos NS disparam é muito grande e abrangente. também é mais fácil implementar um protocolo do que criar qualquer subclasse.
fonte
Tive o mesmo problema e aqui está a minha solução, funciona perfeitamente para mim:
Na visualização ou controlador de visualização que você implementou
<UITextFieldDelegate>
(No meu caso, tenho um personalizado
UITableViewCell
chamado TextFieldCell),Declare o
UITapGestureRecognizer
como uma propriedade:E inicialize-o em sua visualização / controlador:
No
- (void)textFieldDidBeginEditing:(UITextField *)textField
método, usesuperView
para mover até sua tableView e chameaddGestureRecognizer
:E no
- (void)textFieldDidEndEditing:(UITextField *)textField
, basta remover o reconhecedor de gestos:Espero que ajude.
fonte
Eu queria que meu celular abrisse o teclado quando qualquer parte da célula fosse selecionada e fechasse se você clicasse em qualquer lugar fora da célula. Para abrir o teclado:
(NOTA: Eu criei uma subclasse da célula, mas você pode facilmente fazer isso no
tableView:didSelectRowAtIndexPath:
método delegado deUITableView
)Isso significava que, com as soluções principais, se você clicar duas vezes na célula, o teclado irá tremer, pois primeiro o reconhecedor de gestos tenta fechar o teclado e, em seguida, a célula é selecionada novamente e tenta abrir o teclado.
A solução é verificar se o clique ocorreu dentro da célula atualmente selecionada:
fonte
Encontrei uma solução que funciona muito bem.
É necessário usar o UIGestureRecognizerDelegate eo método - GestureRecognizer: shouldReceiveTouch: .
Adicione o reconhecedor de gestos ao TableView da seguinte maneira:
Em seguida, implemente o método de delegado shouldReceiveTouch para rejeitar toques que são executados na classe UITableViewCell. O método hideKeyboard só será chamado quando o toque for executado fora da classe UITableViewCell.
fonte
UITableView
tem umabackgroundView
propriedade útil , com a qual consegui esse comportamento sem mexer na seleção de células, conforme mostrado abaixo no Swift:fonte
Estava procurando a solução e não encontrei nada que se encaixasse no meu código, então fiz assim:
http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap
É basicamente uma combinação das abordagens mencionadas anteriormente, mas não requer nenhuma subclasse ou a criação de botões de fundo.
fonte
Basta usar um UITapGestureRecognizer e
cancelsTouchesInView = NO
significa que os toques nas células e UITextViews também acionam a ocultação. Isso é ruim se você tiver vários UITextViews e tocar no próximo. O teclado começará a se ocultar e, em seguida, o próximo textView se tornará o firstResponder e o teclado ficará visível novamente. Para evitar isso, verifique o local do toque e só oculte o teclado se o toque não estiver em uma célula:Para
scrollViewWillBeginDragging:
ser disparado, ascrollEnabled
propriedade tableView deve serYES
fonte
Por que você deseja criar uma tabela cheia de campos de texto? Você deve usar uma visão detalhada para cada linha que contém os campos de texto. Quando você empurra sua visão detalhada, certifique-se de chamar "[myTextField se torneFirstResponder]" para que o usuário possa começar a editar com apenas um clique de distância da lista da tabela.
fonte
Se você deseja criar uma subclasse (ugh!) De sua visualização de tabela, algo assim pode funcionar:
fonte
Se você deseja dispensar o teclado enquanto a tecla return é pressionada, você pode simplesmente adicionar o seguinte código em textField deve retornar o método, isto é:
Alguns campos de texto podem ter uma visualização seletora ou outra como uma subvisualização, então, nesse caso, o método acima não funciona, então precisamos fazer uso da classe UITapGestureRecognizer, ou seja, adicionar o seguinte trecho de código ao método viewDidLoad, ou seja:
Agora, basta adicionar o respondente de demissão ao método seletor, ou seja:
Espero que ajude, obrigado :)
fonte
Muitas respostas interessantes. Eu gostaria de compilar diferentes abordagens para a solução que achei mais adequada a um cenário UITableView (é o que eu costumo usar): O que geralmente queremos é basicamente esconder o teclado em dois cenários: tocando fora dos elementos da IU de texto, ou ao rolar para baixo / cima no UITableView. O primeiro cenário pode ser facilmente adicionado por meio de TapGestureRecognizer, e o segundo por meio do método UIScrollViewDelegate scrollViewWillBeginDragging :. Primeira ordem do dia, o método para ocultar o teclado:
Este método resigna qualquer interface do usuário textField das subvisualizações dentro da hierarquia de visão UITableView, então é mais prático do que resignar cada elemento individualmente.
Em seguida, cuidamos de dispensar por meio de um gesto de toque externo, com:
Definir tapGestureRecognizer.cancelsTouchesInView como NO é para evitar que o gestoRecognizer substitua o funcionamento interno normal do UITableView (por exemplo, para não interferir na seleção da célula).
Finalmente, para lidar com a ocultação do teclado na rolagem para cima / para baixo no UITableView, devemos implementar o método scrollViewWillBeginDragging: do protocolo UIScrollViewDelegate, como:
arquivo .h
arquivo .m
Espero que ajude! =)
fonte
Veja como eu finalmente fiz as coisas. Combinei sugestões e códigos de diferentes respostas. Recursos: dispensar teclado, mover campos de texto acima do teclado enquanto edita e define o tipo de retorno de teclado "Próximo" e "Concluído ".REPLACE" ... "com mais campos
fonte
A resposta de @mixca é muito útil, mas e se eu tiver algo diferente de UITextField. Acho que a melhor maneira de lidar com isso pesquisando todas as subvisualizações da visualização principal com função recursiva, veja o exemplo abaixo
e também você pode colocar este método em sua classe de utilitário e pode usar a partir de um gesto de toque como a resposta de @mixca ..
fonte
Swift 4 / 4.2 / 5
Você também pode dispensar o teclado quando uma célula é tocada - antes de fazer qualquer outra coisa.
fonte
tableView.keyboardDismissMode = .onDrag // .interactive
fonte