Estoy haciendo una aplicación que usa a UITextView
. Ahora quiero que la Vista de texto tenga un marcador de posición similar al que puede establecer para un Campo de texto. ¿Cómo lograrías esto usando Swift?
ios
swift
uitextview
placeholder
StevenR
fuente
fuente
Respuestas:
Actualizado para Swift 4
UITextView
no tiene inherentemente una propiedad de marcador de posición, por lo que tendría que crear y manipular una mediante programación medianteUITextViewDelegate
métodos. Recomiendo usar cualquiera de las soluciones # 1 o # 2 a continuación dependiendo del comportamiento deseado.Nota: Para cualquier solución, agregue
UITextViewDelegate
a la clase y configuretextView.delegate = self
para usar los métodos delegados de la vista de texto.Solución n. ° 1 : si desea que el marcador de posición desaparezca tan pronto como el usuario seleccione la vista de texto:
Primero configure el
UITextView
para contener el texto del marcador de posición y configúrelo en un color gris claro para imitar el aspecto delUITextField
texto del marcador de posición de un. Puede hacerlo enviewDidLoad
o sobre la creación de la vista de texto.Luego, cuando el usuario comience a editar la vista de texto, si la vista de texto contiene un marcador de posición (es decir, si su color de texto es gris claro), borre el texto del marcador de posición y configure el color del texto en negro para acomodar la entrada del usuario.
Luego, cuando el usuario termina de editar la vista de texto y se resigna como el primer respondedor, si la vista de texto está vacía, restablezca su marcador de posición volviendo a agregar el texto del marcador de posición y configurando su color en gris claro.
Solución n. ° 2 : si desea que el marcador de posición se muestre siempre que la vista de texto esté vacía, incluso si la vista de texto está seleccionada:
Primero establezca el marcador de posición en
viewDidLoad
:(Nota: dado que el OP quería tener seleccionada la vista de texto tan pronto como se carga la vista, incorporé la selección de vista de texto en el código anterior. Si este no es su comportamiento deseado y no desea que la vista de texto se seleccione al cargar la vista, elimine las dos últimas líneas del fragmento de código anterior).
Luego utilice el
shouldChangeTextInRange
UITextViewDelegate
método, así:Y también implemente
textViewDidChangeSelection
para evitar que el usuario cambie la posición del cursor mientras el marcador de posición es visible. (Nota:textViewDidChangeSelection
se llama antes de que se cargue la vista, así que solo verifique el color de la vista de texto si la ventana está visible):fuente
yourTextField.delegate = self
. Si no hace esto,textViewDidBeginEditing
lastextViewDidEndEditing
funciones y no funcionarán.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?
. Transforma lalet updatedText =
línea alet updatedText = currentText?.replacingCharacters(in: range, with: text)
. Finalmente, transforma laif updatedText.isEmpty
línea enif (updatedText?.isEmpty)! {
. ¡Eso debería hacer el truco!textView.selectedTextRange
desde dentrofunc textViewDidChangeSelection(_ textView: UITextView)
provoca un bucle infinito ...Marcador de posición flotante
Es simple, seguro y confiable colocar una etiqueta de marcador de posición sobre una vista de texto, establecer su fuente, color y administrar la visibilidad del marcador de posición mediante el seguimiento de los cambios en el recuento de caracteres de la vista de texto.
Swift 3:
Swift 2: igual, excepto:
italicSystemFontOfSize(textView.font.pointSize)
,UIColor.lightGrayColor
fuente
Recomendamos encarecidamente utilizar la biblioteca KMPlaceholderTextView . Muy simple de usar.
fuente
Rápido:
Agregue su vista de texto mediante programación o mediante Interface Builder, si es el último, cree la salida:
Agregue el delegado (UITextViewDelegate):
En el método viewDidLoad, agregue lo siguiente:
Ahora permítanme presentarles la parte mágica, agregue esta función:
Tenga en cuenta que esto se ejecutará cada vez que comience la edición, allí verificaremos las condiciones para indicar el estado, utilizando la propiedad de color. Establecer texto en
nil
no lo recomiendo. Justo después de eso, configuramos el color del texto al deseado, en este caso, negro.Ahora agregue esta función también:
Permítanme insistir, no lo comparen
nil
, ya lo he intentado y no funcionaría. Luego establecemos los valores de nuevo al estilo de marcador de posición, y establecemos el color de nuevo al color de marcador de posición porque es una condición para registrarsetextViewDidBeginEditing
.fuente
Utilice esta extensión, esta es la mejor manera de establecer un marcador de posición en UITextView. Pero asegúrese de haber adjuntado delegados a TextView. Puede configurar el marcador de posición de esta manera: -
fuente
Me sorprende que nadie lo haya mencionado
NSTextStorageDelegate
.UITextViewDelegate
Los métodos solo serán activados por la interacción del usuario, pero no mediante programación. Por ejemplo, cuando configura una vista de textotext
propiedad de programación, tendrá que establecer la visibilidad del marcador de posición usted mismo, porque no se invocarán los métodos delegados.Sin embargo, con
NSTextStorageDelegate
eltextStorage(_:didProcessEditing:range:changeInLength:)
método, se le notificará cualquier cambio en el texto, incluso si se realiza mediante programación. Simplemente asígnelo así:(En
UITextView
, esta propiedad delegada esnil
predeterminada, por lo que no afectará ningún comportamiento predeterminado).Combinarlo con la
UILabel
técnica de @clearlight demuestra, uno puede fácilmente envolver todo elUITextView
'splaceholder
aplicación en una extensión.Tenga en cuenta que el uso de una clase privada (anidada) llamada
PlaceholderLabel
. No tiene ninguna implementación en absoluto, pero nos proporciona una forma de identificar la etiqueta de marcador de posición, que es mucho más 'rápida' que usar eltag
propiedad.Con este enfoque, aún puede asignar el delegado del
UITextView
a otra persona.Ni siquiera tiene que cambiar las clases de sus vistas de texto. Simplemente agregue las extensiones y podrá asignar una cadena de marcador de posición a cada
UITextView
proyecto, incluso en el Creador de interfaces.Dejé de lado la implementación de una
placeholderColor
propiedad por razones de claridad, pero se puede implementar solo por unas pocas líneas más con una variable calculada similar aplaceholder
.fuente
textView.textStorage.delegate = self
esto en un controlador de vista requerirá que vinculemos con ese controlador de vistaNSTextStorageDelegate
. Realmente se requiere?NSTextStorageDelegate
, no el controlador de vista.Lo hice usando dos vistas de texto diferentes:
La idea es que una vez que el usuario comienza a escribir cosas en la vista de primer plano, el marcador de posición en el fondo desaparece (y vuelve a aparecer si el usuario elimina todo). Por lo tanto, se comporta exactamente como un marcador de posición para el campo de texto de una sola línea.
Aquí está el código que usé para ello. Tenga en cuenta que descriptionField es el campo que escribe el usuario y descriptionPlaceholder es el que está en segundo plano.
fuente
Basado en algunas de las excelentes sugerencias aquí, pude reunir la siguiente subclase ligera, compatible con Interface-Builder
UITextView
, que:UITextField
.text
propiedad del campo .Cualquier sugerencia de mejora es bienvenida, especialmente si hay alguna forma de extraer el color del marcador de posición de iOS mediante programación, en lugar de codificarlo.
Swift v5:
fuente
SET valor en carga vista
fuente
Traté de hacer el código conveniente a partir de la respuesta de clearlight .
uso
fuente
Una solución más (Swift 3):
resultado
fuente
Una solución simple y rápida que funciona para mí es:
fuente
Esto es lo que estoy usando para este trabajo realizado.
Sé que hay varios enfoques similares a este, pero los beneficios de este son:
fuente
Swift 3.2
Primero, cuando el usuario comienza a editar la llamada textViewDidBeginEditing y luego verifica si el color del texto gris significa que el usuario no escribió nada, luego establece como textview nil y cambia el color a negro para enviar mensajes de texto al usuario.
Cuando el usuario finaliza la edición de textViewDidEndEditing es una llamada y comprueba si el usuario no escribe nada en la vista de texto y luego el texto se establece en color gris con el texto "PlaceHolder"
fuente
Aquí está mi forma de resolver este problema ( Swift 4 ):
La idea era hacer la solución más simple posible que permita utilizar marcadores de posición de diferentes colores, cambiar el tamaño al tamaño de los marcadores de posición, no sobrescribir
delegate
mientras tanto, manteniendo todas lasUITextView
funciones funcionando como se esperaba.fuente
No sé por qué las personas complican tanto este problema ... Es bastante sencillo y sencillo. Aquí hay una subclase de UITextView que proporciona la funcionalidad solicitada.
fuente
Esta es mi solución lista para usar si está trabajando con múltiples vistas de texto
fuente
Swift 3.1
Esta extensión funcionó bien para mí: https://github.com/devxoul/UITextView-Placeholder
Aquí hay un fragmento de código:
Instalarlo a través de pod:
Importalo a tu clase
Y agregue
placeholder
propiedad a su ya creadoUITextView
Eso es ... Así se ve (el tercer cuadro es a
UITextView
)fuente
Al contrario de casi todas las respuestas de esta entrada,
UITextView
lo hace tener una propiedad de marcador de posición. Por razones más allá de mi comprensión, solo se expone en IB, como tal:Entonces, si está utilizando guiones gráficos y un marcador de posición estático será suficiente, solo configure la propiedad en el inspector.
También puede establecer esta propiedad en un código como este:
Está nublado en cuanto al clima, se accede a través de una API privada, ya que la propiedad está expuesta.
No he intentado enviar con este método. Pero lo enviaré de esta manera en breve y actualizaré esta respuesta en consecuencia.
ACTUALIZAR:
He enviado este código en varias versiones sin problemas de Apple.
ACTUALIZACIÓN: Esto solo funcionará en Xcode pre 11.2
fuente
UITextField
NOUITextView
lea las preguntas / respuestas con más cuidado.No existe tal propiedad en ios para agregar marcador de posición directamente en TextView, sino que puede agregar una etiqueta y mostrar / ocultar el cambio en textView. SWIFT 2.0 y asegúrese de implementar el textviewdelegate
fuente
Swift: escribí una clase que heredó UITextView y agregué un UILabel como subvista para actuar como marcador de posición.
fuente
Me gusta la solución de @ nerdist. Basado en eso, creé una extensión para
UITextView
:En una clase ViewController, por ejemplo, así es como lo uso:
Marcador de posición en UITextview!
ACTUALIZACIÓN :
En caso de que cambie el texto de la vista de texto en el código, recuerde llamar al método updateVisibitly para ocultar el marcador de posición:
Para evitar que el marcador de posición se agregue más de una vez,
add()
se agrega una función privadaextension
.fuente
En swift2.2:
}
En swift3:
clase CustomTextView: UITextView {
}
Escribí una clase en Swift. Debe importar esta clase cuando sea necesario.
fuente
No puedo agregar comentarios debido a la reputación. agregue una necesidad de delegado más en la respuesta @clearlight.
es necesidad
porque
textViewDidChange
no se llama la primera vezfuente
no, no hay ningún marcador de posición disponible para la vista de texto. debe colocar una etiqueta encima cuando el usuario ingresa en la vista de texto y luego ocultarlo o establecerlo por defecto cuando el usuario ingresa eliminar todos los valores.
fuente
fuente
Tuve que enviar la cola para que mi texto de marcador de posición reapareciera una vez que se completara la edición.
fuente
Rápido:
Agrega tu
TextView
@IBOutlet
:En el
viewWillAppear
método, agregue lo siguiente:Agregue la
Delegate
extensión Usando (UITextViewDelegate):fuente
Nuestra solución evita el robo con las propiedades
UITextView
text
ytextColor
, lo cual es útil si mantiene un contador de caracteres.Es sencillo:
1) Cree un maniquí
UITextView
en Storyboard con las mismas propiedades que el maestroUITextView
. Asigne texto de marcador de posición al texto ficticio.2) Alinee los bordes superior, izquierdo y derecho de los dos
UITextViews.
3) Coloque el maniquí detrás del maestro.
4) Anule la
textViewDidChange(textView:)
función de delegado del maestro y muestre el ficticio si el maestro tiene 0 caracteres. De lo contrario, muestra al maestro.Esto supone que ambos
UITextViews
tienen fondos transparentes. Si no lo hacen, coloque el maniquí en la parte superior cuando haya 0 caracteres y empújelo debajo cuando haya> 0 caracteres. También deberá intercambiar los respondedores para asegurarse de que el cursor siga a la derechaUITextView
.fuente
Swift 4, 4.2 y 5
fuente