Por qué UITextView no tiene placeholder incorporado y cómo solucionarlo
\n\nTodo 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.
¿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.
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!
Método 1: UILabel clásico sobre UITextView
\n\nLa 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.
Cómo funciona
\n\nAgrega 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:
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\nImportante: 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.
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
NSAttributedStringcon diferentes alineaciones. \n
Método 2: Placeholder mediante NSAttributedString
\n\nUna 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\nEste método es especialmente útil si trabaja con UITextView en Swift y no quiere complicarse con vistas adicionales.
\n\nImplementación
\n\nimport UIKit\n\nclass ViewController: UIViewController, UITextViewDelega