Cómo agregar placeholder en UITextView en Swift: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué UITextView no tiene placeholder incorporado y cómo solucionarlo

\n\n

Todo desarrollador de iOS que haya trabajado alguna vez con UITextView se ha enfrentado al mismo problema: a diferencia de UITextField, UITextView no tiene una propiedad placeholder incorporada. Creas un campo de texto multilínea, ejecutas la aplicación y ves un rectángulo blanco vacío. El usuario no entiende qué debe escribir y el diseñador se enfada.

\n\n

¿Por qué Apple no añadió esta propiedad? Históricamente, UITextView se posicionó como un elemento para mostrar y editar grandes volúmenes de texto (por ejemplo, notas o correos), no como un campo de entrada con sugerencia. Pero los tiempos han cambiado: hoy usamos UITextView para comentarios, descripciones, biografías, en todas partes donde se necesita un placeholder.

\n\n

En este artículo, analizaremos 3 métodos comprobados para agregar placeholder text inside UITextView in Swift. Aprenderá cómo hacerlo mediante UILabel, mediante atributos NSAttributedString y creando su propia subclase. ¡Allá vamos!

\n\n

Método 1: UILabel clásico sobre UITextView

\n\n

La forma más simple y comprensible es colocar un UILabel sobre el UITextView y controlar su visibilidad. Este método es ideal para principiantes y para proyectos que no requieren personalización compleja.

\n\n

Cómo funciona

\n\n

Agrega un UILabel como elemento hijo del UITextView, le asigna el texto del placeholder y lo oculta cuando el usuario comienza a escribir. Aquí hay un ejemplo paso a paso:

\n\n
import UIKit\n\nclass ViewController: UIViewController, UITextViewDelegate {\n    \n    @IBOutlet weak var textView: UITextView!\n    let placeholderLabel = UILabel()\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        textView.delegate = self\n        setupPlaceholder()\n    }\n    \n    func setupPlaceholder() {\n        placeholderLabel.text = "Ingrese su comentario..."\n        placeholderLabel.font = UIFont.systemFont(ofSize: 16)\n        placeholderLabel.textColor = UIColor.lightGray\n        placeholderLabel.translatesAutoresizingMaskIntoConstraints = false\n        textView.addSubview(placeholderLabel)\n        \n        NSLayoutConstraint.activate([\n            placeholderLabel.topAnchor.constraint(equalTo: textView.topAnchor, constant: 8),\n            placeholderLabel.leadingAnchor.constraint(equalTo: textView.leadingAnchor, constant: 5),\n            placeholderLabel.trailingAnchor.constraint(equalTo: textView.trailingAnchor, constant: -5)\n        ])\n    }\n    \n    func textViewDidChange(_ textView: UITextView) {\n        placeholderLabel.isHidden = !textView.text.isEmpty\n    }\n}
\n\n

Importante: no olvide establecer el delegado UITextViewDelegate e implementar el método textViewDidChange. Si usa SwiftUI, el enfoque será diferente; allí se usa el modificador .overlay.

\n\n

Ventajas y desventajas

\n
    \n
  • Ventajas: simplicidad, fácil de entender, funciona en cualquier versión de iOS.
  • \n
  • Desventajas: hay que vigilar las restricciones si cambian los insets del textview. Tampoco funciona si el textview tiene un NSAttributedString con diferentes alineaciones.
  • \n
\n\n

Método 2: Placeholder mediante NSAttributedString

\n\n

Una forma más elegante es usar atributos de cadena. La idea es mostrar el placeholder como texto atribuido en color gris, y cuando el usuario comienza a escribir, reemplazarlo con texto normal.

\n\n

Este método es especialmente útil si trabaja con UITextView en Swift y no quiere complicarse con vistas adicionales.

\n\n

Implementación

\n\n
import UIKit\n\nclass ViewController: UIViewController, UITextViewDelega                

Blogs

Book Recommendations