Na biblioteca do IB, a introdução nos diz que, quando a returntecla é pressionada, o teclado UITextView
desaparece. Mas, na verdade, a returnchave só pode atuar como '\ n'.
Posso adicionar um botão e usá-lo [txtView resignFirstResponder]
para ocultar o teclado.
Mas existe uma maneira de adicionar a ação da returntecla no teclado para que eu não precise adicionar UIButton
?
iphone
objective-c
keyboard
uitextview
iphone-softkeyboard
Zhong frio
fonte
fonte
Respostas:
UITextView
não possui nenhum método que será chamado quando o usuário pressionar a tecla Enter. Se você deseja que o usuário possa adicionar apenas uma linha de texto, use aUITextField
. Atingir o retorno e ocultar o teclado para umUITextView
não segue as diretrizes da interface.Mesmo assim, se você quiser fazer isso, implemente o
textView:shouldChangeTextInRange:replacementText:
métodoUITextViewDelegate
e, nessa verificação, se o texto de substituição é\n
, oculte o teclado.Pode haver outras maneiras, mas não conheço nenhuma.
fonte
[textField setReturnKeyType: UIReturnKeyDone];
construtor de interfaces ou usando-oImaginei que eu postaria o trecho aqui:
Certifique-se de declarar suporte ao
UITextViewDelegate
protocolo.Atualização do Swift 4.0:
fonte
Eu sei que isso já foi respondido, mas eu realmente não gosto de usar a string literal para a nova linha, então aqui está o que eu fiz.
Atualização do Swift 4.0:
fonte
NSString *replacedText = [textView.text stringByReplacingCharactersInRange:range withString:text]
.Sei que isso já foi respondido várias vezes, mas aqui estão meus dois centavos para o problema.
Eu achei as respostas de samvermette e ribeto realmente úteis, e também o comentário de maxpower na resposta do ribeto . Mas há um problema com essas abordagens. O problema que Matt menciona na resposta do samvermette é que, se o usuário quiser colar algo com uma quebra de linha, o teclado se esconderá sem colar nada.
Portanto, minha abordagem é uma mistura das três soluções mencionadas acima e apenas verificamos se a string inserida é uma nova linha quando o comprimento da string é 1, para garantir que o usuário esteja digitando em vez de colar.
Aqui está o que eu fiz:
fonte
Uma maneira mais elegante é descartar o teclado quando o usuário toca em algum lugar fora do quadro do teclado.
Primeiro, defina a visualização do seu ViewController para a classe "UIControl" no inspetor de identidade do UIBuilder. Arraste a vista para o arquivo de cabeçalho do ViewController com a tecla Control pressionada e vincule-a como uma ação ao evento como Retoque interno, como:
ViewController.h
No arquivo principal do ViewController, ViewController.m:
Você pode exigir um toque duplo ou toque longo usando técnicas semelhantes. Pode ser necessário definir seu ViewController como UITextViewDelegate e conectar o TextView ao ViewController. Este método funciona para UITextView e UITextField.
Fonte: Big Nerd Ranch
EDIT: Eu também gostaria de acrescentar que, se você estiver usando um UIScrollView, a técnica acima pode não funcionar tão facilmente através do Interface Builder. Nesse caso, você pode usar um UIGestureRecognizer e chamar o método [[self view] endEditing: YES] dentro dele. Um exemplo seria:
Quando o usuário toca fora do teclado e não toca em um espaço de entrada, o teclado será descartado.
fonte
GestureRecognizer
mas com um grande problema é que todos os botões ou controles na exibição não são mais clicáveis.Adicione este método ao seu controlador de exibição.
Swift :
Este método também pode ser útil para você:
fonte
super.touchesBegan(touches:withEvent:)
.else { return true }
.Adicione também
UITextViewDelegate
Não se esqueça de confirmar o protocolo
Se você não adicionou,
if([text isEqualToString:@"\n"])
não pode editarfonte
NO
se o texto for igual a@"\n"
.Há outra solução ao usar o uitextview. Você pode adicionar a barra de ferramentas como InputAccessoryView em "textViewShouldBeginEditing" e, no botão pronto desta barra de ferramentas, você pode descartar o teclado, o código a seguir é o seguinte:
fonte
Achei a resposta de josebama a resposta mais completa e limpa disponível neste tópico.
Abaixo está a sintaxe do Swift 4 :
fonte
resultRange
objetivo é testar se o texto contém apenas linhas novas que evitam "\ n" código rígido.rápido
fonte
Usando o controlador de navegação para hospedar uma barra para descartar o teclado:
no arquivo .h:
no arquivo .m:
fonte
Assim como comentários matt para samvermette, também não gosto da idéia de detectar "\ n". A tecla "return" existe por um motivo no UITextView, que é ir para a próxima linha do curso.
A melhor solução, na minha opinião, é imitar o aplicativo de mensagens do iPhone - que é adicionar a barra de ferramentas (e o botão) ao teclado.
Eu recebi o código da seguinte postagem no blog:
http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/
Passos:
-Adicione barra de ferramentas ao seu arquivo XIB - defina a altura para 460
- Adicione o item do botão da barra de ferramentas (se ainda não tiver sido adicionado). Se você precisar alinhar à direita, adicione também o item do botão de barra flexível ao XIB e mova o item do botão da barra de ferramentas
-Crie uma ação que vincule seu item de botão a resignFirstResponder da seguinte maneira:
-Então:
fonte
Apenas resolvi esse problema de uma maneira diferente.
Controle arraste o botão para o
viewController.h
arquivo e crie uma ação (Evento enviado: Retoque interno) como:Em
ViewController.m
deve se parecer com:fonte
Adicionar um observador no viewDidLoad
e use o seletor para verificar "\ n"
Ele usa "\ n" e não verifica especificamente se há uma chave de retorno, mas acho que está OK.
ATUALIZAR
Veja a resposta da ribto abaixo, que usa
[NSCharacterSet newlineCharacterSet]
no lugar de\n
fonte
\n
e a chave de retorno é detectada com base em,\n
portanto, verifica a chave de retorno. A única diferença é que você está usando notificações em vez de usar o textViewDelegates.[NSCharacterSet newlineCharacterSet]
que procurar e não \ n pode ser o melhor caminho a percorrer.Código Swift
Implemente UITextViewDelegate em sua classe / View da seguinte forma:
defina o delegado textView como auto
E, em seguida, implemente o seguinte:
EDIT Atualizei o código porque nunca é uma boa ideia alterar a entrada do usuário em um campo de texto para uma solução alternativa e não redefinir o estado após a conclusão do código de hack.
fonte
Tente o seguinte:
fonte
// Você pode usar isso ...
Etapa 1. A primeira etapa é certificar-se de que você declara suporte ao
UITextViewDelegate
protocolo. Isso é feito no seu arquivo de cabeçalho, como exemplo, aqui está o cabeçalho chamadoEditorController.h:
Etapa 2. Em seguida, você precisará registrar o controlador como o representante do UITextView. Continuando com o exemplo acima, aqui está como eu inicializei o
UITextView
comEditorController
como delegado…Etapa 3. E agora a peça final do quebra-cabeça é agir em resposta à
shouldCahngeTextInRange
mensagem da seguinte maneira:fonte
Você também pode ocultar o teclado ao tocar na tela de visualização:
fonte
Resposta rápida:
fonte
Eu usei esse código para alterar o respondedor.
fonte
A pergunta pergunta como fazê-lo com a tecla Enter, mas acho que isso poderia ajudar alguém com a intenção de simplesmente fazer o teclado desaparecer ao usar o UITextView:
Chame addToolBarForTextView () no viewDidLoad ou em outro método de ciclo de vida.
Parece que foi a solução perfeita para mim.
Felicidades,
Murat
fonte
Está bem. Todo mundo deu respostas com truques, mas acho que o caminho certo para conseguir isso é
Conectando a seguinte ação ao evento " Terminou na saída " em
Interface Builder
. (clique com o botão direito do mouseTextField
e arraste com a tecla Ctrl pressionada de ' Terminou ao sair ' para o seguinte método.fonte
Semelhante a outras respostas usando a
UITextViewDelegate
interface rápida, mas mais recente,isNewline
seria:fonte
fonte
fonte
Eu sei que não é a resposta exata para essa pergunta, mas encontrei esse tópico depois de procurar na Internet uma resposta. Suponho que outros compartilhem esse sentimento.
Essa é a minha variação do UITapGestureRecognizer que considero confiável e fácil de usar - basta definir o delegado do TextView como o ViewController.
Em vez de ViewDidLoad, adiciono o UITapGestureRecognizer quando o TextView se torna ativo para edição:
Quando toco fora do TextView, a exibição termina o modo de edição e o UITapGestureRecognizer se remove para que eu possa continuar interagindo com outros controles na exibição.
Eu espero que isso ajude. Parece tão óbvio, mas nunca vi essa solução em nenhum lugar da Web - estou fazendo algo errado?
fonte
Não se esqueça de definir o delegado para o textView - caso contrário, resignfirstresponder não funcionará.
fonte
Tente isso.
fonte
Para o Xcode 6.4., Swift 1.2. :
fonte
Você deve adicionar
UIToolbar
ao topo o UITextView para facilitar, em vez de usarshouldChangeTextIn
Em Swift 4
fonte
toolbar.sizeToFit()