Nota:
Consulte a resposta aceita (que não é a mais votada) para a solução a partir do iOS 4.3.
Esta pergunta é sobre um comportamento descoberto no teclado do iPad, onde se recusa a ser descartado se mostrado em uma caixa de diálogo modal com um controlador de navegação.
Basicamente, se eu apresentar o controlador de navegação com a seguinte linha, como abaixo:
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
O teclado se recusa a ser descartado. Se eu comentar esta linha, o teclado desaparecerá bem.
...
Eu tenho dois campos de texto, nome de usuário e senha; o nome de usuário possui o botão Avançar e a senha o botão Concluído. O teclado não desaparecerá se eu apresentar isso em um controlador de navegação modal.
TRABALHO
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];
NÃO FUNCIONA
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
Se eu remover a parte do controlador de navegação e apresentar 'b' como um controlador de exibição modal por si só, ele funcionará. O controlador de navegação é o problema?
TRABALHO
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];
TRABALHO
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
UINavigationController
aula. Felicidades.resignFirstResponder
estar executando, mas o teclado ainda está sendo mostrado. Meu cenário (presentationFormSheet com navig contrllr) é exatamente o mesmo que o seu. Muito obrigado !!Respostas:
No controlador de exibição que é apresentado modalmente, basta substituir
disablesAutomaticKeyboardDismissal
para retornarNO
:fonte
Isso foi classificado como "funciona como pretendido" pelos engenheiros da Apple. Eu registrei um bug por isso há algum tempo. O raciocínio deles é que o usuário geralmente inserirá dados de forma modal, de modo a tentar ser "útil" e manter o teclado visível onde normalmente várias transições na exibição modal podem fazer com que o teclado seja exibido / oculto repetidamente.
edit: aqui está a resposta de um engenheiro da Apple nos fóruns de desenvolvedores:
Isso está causando muitos problemas para as pessoas (inclusive eu), mas no momento não parece haver uma maneira de contornar isso.
ATUALIZAR:
No iOS 4.3 e posterior, agora você pode implementar `-disablesAutomaticKeyboardDismissal 'no seu controlador de exibição para retornar NO:
Isso corrige o problema.
fonte
UINavigationController
subclasse que substituadisablesAutomaticKeyboardDismissal
para retornarNO
e usá-la como controlador de navegação quando apresentar uma folha de formulário modal. Veja a resposta de @ miha-hribar abaixo.Tenha cuidado se estiver exibindo o modal com a
UINavigationController
. Você precisa definir odisablesAutomaticKeyboardDismissal
no controlador de navegação e não no controlador de exibição. Você pode fazer isso facilmente com categorias.Arquivo: UINavigationController + KeyboardDismiss.h
Arquivo: UINavigationController + KeyboardDismiss.m
Não esqueça de importar a categoria no arquivo em que você usa o UINavigationController.
fonte
disablesAutomaticKeyboardDismissal
deUINavigationController
, não o próprio controlador de vista, para corrigir esse problema.Resolvi isso usando o
UIModalPresentationPageSheet
estilo de apresentação e redimensionando-o imediatamente após a apresentação. Igual a:fonte
Se você alternar para uma exibição modal diferente, poderá fazer com que o teclado desapareça. Não é bonito e não anima, mas você pode fazer com que ele desapareça.
Seria ótimo se houvesse uma correção, mas por enquanto isso funciona. Você pode inseri-lo em uma categoria
UIViewController
e chamá-lo quando quiser que o teclado seja desativado:Tenha cuidado com isso, enquanto visualizaDidAppear / viewDidDisappear e todos esses métodos são chamados. Como eu disse, não é bonito, mas funciona.
-Adão
fonte
Você também pode contornar isso em um aplicativo universal, basta verificar o idioma e, se for um iPad, não abra o teclado automaticamente e deixe o usuário tocar no que quiser editar.
Pode não ser a solução mais agradável, mas é muito simples e não precisa de hacks sofisticados que irão romper com o próximo grande lançamento do iOS :)
fonte
Coloque esse código em sua viewWillDisappear: o método do controlador atual é outra maneira de corrigir isso:
fonte
Descobri que
disablesAutomaticKeyboardDismissal
adicionar umadisablesAutomaticKeyboardDismissal
função não funcionava para o meuUITextField
em uma caixa de diálogo modal.O teclado na tela simplesmente não desapareceu.
Minha solução foi desativar todos os controles de entrada de texto na minha caixa de diálogo e reativar os relevantes uma fração de segundo depois.
Parece que quando iOS vê que nenhum dos
UITextField
controles são ativados, então ele não se livrar do teclado.fonte
Tenho certeza que você analisou isso, mas você tem certeza de que sua classe de controlador está conectada corretamente como delegada UITextField, certo?
fonte
talvez não retorne NÃO, mas SIM. Então isso pode ir embora.
E você também tem um
textFieldShouldEndEditing
retorno SIM?E por que você está atirandodesculpe eu vejo agora[nextResponder becomeFirstResponder]
?!Podemos assumir que nenhum deles, por acaso, tem um
tag
valor desecondField.tag+1
? Nesse caso, você está dizendo para eles se tornarem o primeiro a responder, em vez de renunciar ao primeiro. Talvez coloque algum NSLog () nessa estrutura if.fonte
NSLog("tf %x / method ...",textField);
em todas as funções de delegado?Para aqueles que têm problemas com o UINavigationController, consulte minha resposta para uma pergunta semelhante aqui: https://stackoverflow.com/a/10507689/321785
Edit: Eu considero isso uma melhoria na solução de Miha Hribar (já que a decisão está ocorrendo onde deveria), e em oposição ao comentário de Pascal sobre uma categoria no UIViewController
fonte
pode não ser uma solução perfeita, mas funciona
[self.view endEditing: YES];
de onde seu botão ou gesto é implementado para apresentar modal
fonte
fonte