Estou fazendo um aplicativo que usa a UITextView
. Agora, quero que a exibição de texto tenha um espaço reservado semelhante ao que você pode definir para um campo de texto. Como você faria isso usando o Swift?
ios
swift
uitextview
placeholder
StevenR
fonte
fonte
Respostas:
Atualizado para o Swift 4
UITextView
não possui inerentemente uma propriedade de espaço reservado, então você precisa criar e manipular uma programaticamente usandoUITextViewDelegate
métodos. Eu recomendo usar a solução 1 ou 2 abaixo, dependendo do comportamento desejado.Nota: Para qualquer solução, adicione
UITextViewDelegate
à classe e configuretextView.delegate = self
para usar os métodos de delegação da exibição de texto.Solução 1 - Se você desejar que o espaço reservado desapareça assim que o usuário selecionar a exibição de texto:
Primeiro, defina o
UITextView
para conter o texto do espaço reservado e defina-o com uma cor cinza claro para imitar a aparência doUITextField
texto do espaço reservado. Faça isso naviewDidLoad
criação da exibição de texto ou após ela.Então, quando o usuário começar a editar a exibição de texto, se ela contiver um espaço reservado (por exemplo, se a cor do texto estiver em cinza claro), limpe o espaço reservado e defina a cor do texto para preto para acomodar a entrada do usuário.
Em seguida, quando o usuário terminar de editar a exibição de texto e ela for renunciada como a primeira resposta, se a exibição de texto estiver vazia, redefina seu espaço reservado adicionando novamente o texto do espaço reservado e definindo sua cor para cinza claro.
Solução 2 - Se você deseja que o espaço reservado seja exibido sempre que a exibição de texto estiver vazia, mesmo que a exibição de texto esteja selecionada:
Primeiro, defina o espaço reservado no
viewDidLoad
:(Observação: como o OP queria que a visualização de texto fosse selecionada assim que a visualização fosse carregada, incorporei a seleção da visualização de texto no código acima. Se esse não é o seu comportamento desejado e você não deseja que a visualização de texto seja selecionada após o carregamento da visualização, remova as duas últimas linhas do bloco de código acima.)
Em seguida, utilize o
shouldChangeTextInRange
UITextViewDelegate
método, assim:E também implemente
textViewDidChangeSelection
para impedir que o usuário altere a posição do cursor enquanto o espaço reservado estiver visível. (Nota:textViewDidChangeSelection
é chamado antes que a visualização seja carregada, verifique somente a cor da visualização de texto se a janela estiver visível):fonte
yourTextField.delegate = self
. Se você não fizer isso,textViewDidBeginEditing
astextViewDidEndEditing
funções e não funcionarão.Cannot convert value of type 'NSRange' (aka '_NSRange') to expected argument type 'Range<String.Index>' (aka 'Range<String.CharacterView.Index>')
.let currentText = textView.text as NSString?
. Transforme alet updatedText =
linha emlet updatedText = currentText?.replacingCharacters(in: range, with: text)
. Por fim, transforme aif updatedText.isEmpty
linha emif (updatedText?.isEmpty)! {
. Isso deve fazer o truque!textView.selectedTextRange
de dentrofunc textViewDidChangeSelection(_ textView: UITextView)
faz com que um loop infinito ...Espaço reservado flutuante
É simples, seguro e confiável posicionar um rótulo de espaço reservado acima de uma exibição de texto, definir sua fonte, cor e gerenciar a visibilidade do espaço reservado, acompanhando as alterações na contagem de caracteres da exibição de texto.
Swift 3:
Swift 2: mesmo, exceto:
italicSystemFontOfSize(textView.font.pointSize)
,UIColor.lightGrayColor
fonte
É altamente recomendável usar a biblioteca KMPlaceholderTextView . Muito simples de usar.
fonte
Rápido:
Adicione sua exibição de texto programaticamente ou via Interface Builder, se for o último, crie a saída:
Por favor, adicione o delegado (UITextViewDelegate):
No método viewDidLoad, adicione o seguinte:
Agora, deixe-me apresentar a parte mágica, adicione esta função:
Observe que isso será executado sempre que a edição for iniciada. Lá, verificaremos as condições para informar o estado, usando a propriedade color. Definir o texto para
nil
eu não recomendo. Logo depois disso, definimos a cor do texto como desejada, neste caso, preto.Agora adicione também esta função:
Deixe-me insistir, não compare com
nil
, eu já tentei isso e não funcionaria. Em seguida, definimos os valores de volta ao estilo do espaço reservado e a cor de volta à cor do espaço reservado, pois é uma condição para fazer check-intextViewDidBeginEditing
.fonte
Use This Extension, é a melhor maneira de definir espaço reservado no UITextView. Mas verifique se anexou delegados ao TextView. Você pode definir o espaço reservado desta forma: -
fonte
Estou surpreso que ninguém tenha mencionado
NSTextStorageDelegate
.UITextViewDelegate
Os métodos de apenas serão acionados pela interação do usuário, mas não programaticamente. Por exemplo, quando você define atext
propriedade de uma exibição de texto de forma programática, terá que definir a visibilidade do espaço reservado, porque os métodos delegados não serão chamados.No entanto, com
NSTextStorageDelegate
otextStorage(_:didProcessEditing:range:changeInLength:)
método, você será notificado sobre qualquer alteração no texto, mesmo que seja feita de forma programática. Basta atribuir assim:(Em
UITextView
, essa propriedade delegada énil
por padrão, não afeta nenhum comportamento padrão.)Combiná-lo com a
UILabel
técnica @clearlight demonstra, pode-se facilmente envolver toda aUITextView
'splaceholder
implementação em uma extensão.Observe que o uso de uma classe privada (aninhada) é chamada
PlaceholderLabel
. Ele não tem nenhuma implementação, mas fornece uma maneira de identificar o rótulo do espaço reservado, que é muito mais 'rápido' do que usar atag
propriedade.Com essa abordagem, você ainda pode atribuir o delegado da a
UITextView
outra pessoa.Você nem precisa alterar as classes das visualizações de texto. Basta adicionar a (s) extensão (ões) e você poderá atribuir uma sequência de marcadores a cada um
UITextView
no seu projeto, mesmo no Interface Builder.Eu deixei de fora a implementação de uma
placeholderColor
propriedade por motivos de clareza, mas ela pode ser implementada por apenas mais algumas linhas com uma variável computada semelhante aplaceholder
.fonte
textView.textStorage.delegate = self
isso em um controlador de exibição exigirá que vinculemos esse controlador de exibiçãoNSTextStorageDelegate
. É realmente requer?NSTextStorageDelegate
, não o controlador de exibição.Eu fiz isso usando duas visualizações de texto diferentes:
A idéia é que, assim que o usuário começar a digitar itens na exibição em primeiro plano, o espaço reservado em segundo plano desaparecerá (e reaparecerá se o usuário excluir tudo). Portanto, ele se comporta exatamente como um espaço reservado para o campo de texto de linha única.
Aqui está o código que eu usei para isso. Observe que descriptionField é o campo em que o usuário digita e descriptionPlaceholder é o campo em segundo plano.
fonte
Com base em algumas das excelentes sugestões já apresentadas, pude reunir a seguinte subclasse leve e compatível com o Interface Builder
UITextView
, que:UITextField
.text
propriedade do campo .Quaisquer sugestões de melhoria são bem-vindas, especialmente se houver alguma maneira de extrair a cor do espaço reservado do iOS por meio de programação, em vez de codificá-la.
Swift v5:
fonte
Valor SET no carregamento da vista
fonte
Tentei tornar o código conveniente clearlight 's resposta .
uso
fonte
Mais uma solução (Swift 3):
resultado
fonte
Uma solução simples e rápida que funciona para mim é:
fonte
Aqui está o que estou usando para este trabalho.
Eu sei que existem várias abordagens semelhantes a essa, mas os benefícios dessa são:
fonte
Swift 3.2
Primeiro, quando o usuário começa a editar a chamada textViewDidBeginEditing e, em seguida, verifica se a cor cinza do texto significa que o usuário não escreveu nada; depois, definiu como nulo e altere a cor para preto para as mensagens de texto do usuário.
Quando o usuário final editar textViewDidEndEditing é chamar e verificar se o usuário não escreve nada no textview, o texto é definido como cor cinza com o texto "PlaceHolder"
fonte
Aqui está a minha maneira de resolver este problema ( Swift 4 ):
A idéia era tornar a solução mais simples possível, que permite usar espaços reservados de cores diferentes, redimensionar para o tamanho dos espaços reservados, não sobrescreverá
delegate
enquanto isso, mantendo todas asUITextView
funções funcionando conforme o esperado.fonte
Não sei por que as pessoas complicam tanto esse problema ... É bastante direto e simples. Aqui está uma subclasse de UITextView que fornece a funcionalidade solicitada.
fonte
Esta é a minha solução pronta para uso, se você estiver trabalhando com várias visualizações de texto
fonte
Swift 3.1
Esta extensão funcionou bem para mim: https://github.com/devxoul/UITextView-Placeholder
Aqui está um trecho de código:
Instale-o via pod:
Importá-lo para sua turma
E adicione
placeholder
propriedade ao seu já criadoUITextView
É isso aí ... Aqui está a aparência (a terceira caixa é a
UITextView
)fonte
Ao contrário do que apenas sobre cada resposta sobre este post,
UITextView
faz tem uma propriedade do espaço reservado. Por razões além da minha compreensão, ele é exposto apenas no IB, como tal:Portanto, se você estiver usando storyboards e um espaço reservado estático será suficiente, basta definir a propriedade no inspetor.
Você também pode definir esta propriedade no código como este:
Sua nebulosidade quanto ao clima é acessada via API privada, pois a propriedade é exposta.
Não tentei enviar com esse método. Mas enviarei esse caminho em breve e atualizarei essa resposta.
ATUALIZAR:
Eu enviei esse código em várias versões sem problemas da Apple.
UPDATE: Isso funcionará apenas no Xcode pré 11.2
fonte
UITextField
NÃO,UITextView
por favor leia as perguntas / respostas com mais cuidado.Não existe essa propriedade no ios para adicionar espaço reservado diretamente no TextView. Em vez disso, você pode adicionar um rótulo e mostrar / ocultar a alteração no textView. SWIFT 2.0 e certifique-se de implementar o textviewdelegate
fonte
Swift - escrevi uma classe que herdou o UITextView e adicionei um UILabel como uma subview para atuar como um espaço reservado.
fonte
Eu gosto da solução do @ nerdist. Com base nisso, criei uma extensão para
UITextView
:Em uma classe ViewController, por exemplo, é assim que eu a uso:
Espaço reservado no UITextview!
ATUALIZAR :
Caso você altere o texto do textview no código, lembre-se de chamar o método updateVisibitly para ocultar o espaço reservado:
Para impedir que o espaço reservado seja adicionado mais de uma vez, uma
add()
função privada é adicionadaextension
.fonte
No swift2.2:
}
Em swift3:
classe CustomTextView: UITextView {
}
Eu escrevi uma aula rapidamente. Você precisa importar esta classe sempre que necessário.
fonte
Não posso adicionar comentários por causa da reputação. adicione mais uma necessidade de delegado na resposta do @clearlight.
é preciso
porque
textViewDidChange
não é chamado pela primeira vezfonte
não, não existe nenhum espaço reservado para visualização de texto. você deve colocar o rótulo acima dele quando o usuário digitar no modo de exibição de texto e depois ocultá-lo ou definir o valor padrão quando o usuário digitar remover todos os valores.
fonte
fonte
Eu tive que despachar a fila para que o texto do meu espaço reservado reaparecesse assim que a edição fosse concluída.
fonte
Rápido:
Adicione o seu
TextView
@IBOutlet
:No
viewWillAppear
método, adicione o seguinte:Por favor, adicione a
Delegate
extensão Using (UITextViewDelegate):fonte
Nossa solução evita mexer com as propriedades
UITextView
text
etextColor
, o que é útil se você estiver mantendo um contador de caracteres.É simples:
1) Crie um manequim
UITextView
no Storyboard com as mesmas propriedades que o mestreUITextView
. Atribua o texto do espaço reservado ao texto fictício.2) Alinhe as bordas superior, esquerda e direita dos dois
UITextViews.
3) Coloque o manequim atrás do mestre.
4) Substitua o
textViewDidChange(textView:)
função delegada do mestre e mostre o manequim se o mestre tiver 0 caracteres. Caso contrário, mostre o mestre.Isso pressupõe que ambos
UITextViews
tenham planos de fundo transparentes. Caso contrário, coloque o boneco em cima quando houver 0 caracteres e empurre-o por baixo quando houver> 0 caracteres. Você também precisará trocar os respondedores para garantir que o cursor siga à direitaUITextView
.fonte
Swift 4, 4.2 e 5
fonte