UITextField es un componente estándar de UIKit para la entrada de texto de una sola línea en iOS, que hereda de UIControl y admite una amplia gama de modos de teclado. Según la documentación de Apple Developer (2025), UITextField proporciona el delegado UITextFieldDelegate con las devoluciones de llamada shouldBeginEditing, shouldChangeCharactersInRange y shouldReturn. A diferencia de UITextView, UITextField limita la entrada a una sola línea y admite secureTextEntry, leftView y rightView para controles personalizados. Este es el elemento principal para formularios de autorización, búsqueda, registro y entrada de datos en aplicaciones iOS.
Puntos clave
UITextField es una clase del framework UIKit diseñada para la entrada de texto de una sola línea por parte del usuario. La clase hereda de UIControl, lo que permite suscribirse a eventos de entrada mediante el mecanismo target-action: addTarget(self, action: Selector("textChanged:"), for: editingChanged). UITextField muestra un borde (borderStyle), texto placeholder cuando el campo está vacío, un botón de limpieza (clearButtonMode) y puede contener vistas auxiliares izquierda/derecha. El campo muestra/oculta automáticamente el teclado al ganar/perder el foco mediante becomeFirstResponder y resignFirstResponder. El tamaño del campo se determina mediante intrinsicContentSize basado en la fuente y el estilo del borde. Para crear un UITextField en Interface Builder (Storyboard/XIB), use la Biblioteca de Objetos; mediante programación, use el inicializador UITextField(frame: CGRect). La clase es totalmente compatible con la arquitectura moderna de iOS: Combine publishers, @Published en SwiftUI mediante UIViewRepresentable y Diffable Data Source para formularios.
UITextField admite 12 tipos de teclado mediante la propiedad keyboardType. Cada tipo optimiza el conjunto de caracteres para un escenario de entrada específico. UIKeyboardType.default — teclado QWERTY estándar. UIKeyboardType.numberPad — solo dígitos sin símbolos adicionales (ideal para códigos PIN y números de teléfono). UIKeyboardType.emailAddress — teclado con @ y punto en la capa principal. UIKeyboardType.URL — teclado con .com, / y punto en la capa principal. UIKeyboardType.phonePad — teclado numérico con +, *, # para ingresar números de teléfono. UIKeyboardType.decimalPad — dígitos con punto decimal para ingresar precios. UIKeyboardType.webSearch — teclado con botón Ir optimizado para consultas de búsqueda. UIKeyboardType.asciiCapable — solo caracteres ASCII para texto latino. El teclado aparece al llamar a becomeFirstResponder y se oculta al llamar a resignFirstResponder. El tipo de teclado se puede cambiar dinámicamente durante la edición.
| Tipo | Escenario | Características |
|---|---|---|
| default | Entrada de texto general | QWERTY estándar |
| numberPad | PIN, código | Solo dígitos 0-9 |
| emailAddress | Correo electrónico | @ y punto en capa principal |
| URL | Dirección web | .com, /, punto en principal |
| phonePad | Teléfono | Dígitos, +, *, # |
| decimalPad | Precio, número | Dígitos + punto decimal |
UITextFieldDelegate es un protocolo que define el comportamiento del campo de texto en diferentes etapas de la entrada. Métodos principales: textFieldShouldBeginEditing(textField) — devuelve un Bool que permite o deniega el inicio de la edición; textFieldDidBeginEditing — se llama después de que aparece el teclado; textFieldShouldEndEditing — verifica si se puede completar la edición (si es false, el campo no pierde el foco); textFieldDidEndEditing — se llama después de ocultar el teclado; textFieldShouldChangeCharactersInRange — se llama en cada entrada de carácter, permite filtrar la entrada (solo se permite un carácter, si se devuelve false, el carácter no se agrega); textFieldShouldReturn — se llama al presionar Return/Go/Next/Search, se usa para pasar al siguiente campo. El delegado no es Optional: todos los métodos tienen una implementación predeterminada, pero para un comportamiento personalizado es necesario sobrescribir el método correspondiente.
El método shouldReturn es el patrón estándar para navegar entre campos de formulario. Implementación: textFieldShouldReturn(textField) — verificar qué textField activó el evento y mover el foco al siguiente campo mediante becomeFirstResponder(). Si es el último campo, llamar a resignFirstResponder() para ocultar el teclado. Use IBOutlet collection o IBOutlets separados para cada campo para almacenar referencias a los campos.
isSecureTextEntry — una propiedad de UITextField que, cuando es true, reemplaza los caracteres ingresados con viñetas (•) y bloquea la copia de texto mediante UIMenuController. Se usa para campos de contraseña, códigos PIN, CVV. Al cambiar entre el modo seguro y el texto normal (show/hide password), establezca textField.isSecureTextEntry.toggle(). Importante: al cambiar isSecureTextEntry, el texto del campo se restablece — guárdelo de antemano. LeftView y RightView son UIView personalizados que se muestran dentro del campo de entrada a la izquierda o derecha. Uso típico: un icono de búsqueda en leftView, un botón "Limpiar" en rightView. Configuración: textField.leftViewMode = always (siempre) o whileEditing (solo al editar). Las vistas left/right se posicionan automáticamente dentro del campo de texto considerando el padding. El tamaño de la vista se establece mediante bounds o Auto Layout.
import UIKit
class LoginViewController: UIViewController {
let passwordField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
passwordField.isSecureTextEntry = true
passwordField.placeholder = "Password"
passwordField.keyboardType = .asciiCapable
passwordField.delegate = self
// Botón personalizado mostrar/ocultar contraseña
let showButton = UIButton(type: .system)
showButton.setTitle("Mostrar", for: .normal)
showButton.addTarget(self, action: #selector(togglePasswordVisibility),
for: .touchUpInside)
passwordField.rightView = showButton
passwordField.rightViewMode = .always
}
@objc func togglePasswordVisibility() {
passwordField.isSecureTextEntry.toggle()
}
}
UITextInputTraits es un protocolo que define la apariencia visual y de comportamiento del teclado para UITextField. Propiedades principales: autocorrectionType (.default, .no, .yes) — activa o desactiva la autocorrección de texto; autocapitalizationType (.none, .words, .sentences, .allCharacters) — bloqueo automático de mayúsculas para el primer carácter; spellCheckingType — corrección ortográfica; returnKeyType (.done, .go, .next, .search, .send, .continue, .join, .route, .emergencyCall) — texto del botón Return en el teclado; enablesReturnKeyAutomatically — bloqueo automático del botón Return cuando el campo está vacío. Para campos de entrada de nombre, use autocapitalizationType = .words; para correo electrónico, use autocorrectionType = .no; para URL, use keyboardType = .URL + autocapitalizationType = .none. Las traits se configuran después de la inicialización del campo antes de su visualización. Cambiar las traits dinámicamente actualiza el teclado en su próxima aparición.
Return Key Type define el texto del botón en el teclado: Next — pasar al siguiente campo, Done — completar la entrada, Search — iniciar búsqueda, Send — enviar el formulario, Continue — continuar llenando. Combinado con el método delegado shouldReturn, returnKeyType permite una UX natural: el usuario llena los campos, presionando Next para pasar al siguiente, y Done para enviar en el último campo. Para la personalización del texto del botón, use UIButtonConfiguration en iOS 15+.
El placeholder de UITextField es el texto que se muestra en gris cuando el campo está vacío. Configuración: textField.placeholder = "Enter email". Para personalizar el color y la fuente del placeholder, use attributedPlaceholder con NSAttributedString. La máscara de entrada se implementa mediante el método delegado shouldChangeCharactersInRange — admite formatos de número de teléfono, fecha, tarjeta de crédito y SNILS. La máscara de entrada permite separar la visualización del valor: el usuario ve texto formateado (p. ej., +7 (999) 999-99-99), mientras que el modelo almacena "79999999999". Ejemplo de implementación: almacenar la máscara como una cadena con caracteres X para reemplazo; en cada entrada, formar la cadena formateada y devolver false en shouldChangeCharactersInRange, reemplazando el texto del campo mediante textField.text = formattedText. Para números, use NumberFormatter y el keyboardType decimal.
extension LoginViewController: UITextFieldDelegate {
func textFieldShouldReturn(
textField: UITextField
) -> Bool {
if textField == emailField {
passwordField.becomeFirstResponder()
} else if textField == passwordField {
textField.resignFirstResponder()
loginTapped()
}
return true
}
func textField(
textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String
) -> Bool {
// Bloquear espacios en email
if textField == emailField && string == " " {
return false
}
// Límite de longitud de contraseña
if textField == passwordField {
let newLength = (textField.text?.count ?? 0) +
string.count - range.length
return newLength <= 32
}
return true
}
}
Veamos un ejemplo completo de implementación de un formulario de inicio de sesión con UITextField, validación de correo electrónico y retroalimentación visual. El formulario contiene dos campos: emailField (teclado emailAddress, sin autocorrección) y passwordField (secureTextEntry). La validación se realiza en shouldChangeCharactersInRange y adicionalmente al presionar el botón Login. Para retroalimentación visual: borde rojo (layer.borderColor) en error, verde — en validación exitosa. Restablecimiento del borde al comenzar la edición en textFieldDidBeginEditing.
La validación de correo electrónico se realiza mediante NSPredicate con el formato "SELF MATCHES %@" y una expresión regular para la verificación básica del formato. La verificación real de la existencia del correo debe realizarse en el servidor. Para validación avanzada, use la biblioteca SwiftValidators o Combine publishers. Ejemplo: NSPredicate(format: "SELF MATCHES [c] %@", emailRegex).evaluate(with: email). El borde del campo se actualiza mediante un bloque de animación para una transición suave.
func validateEmail(textField: UITextField) {
guard let text = textField.text, !text.isEmpty else {
textField.layer.borderColor = UIColor.clear.cgColor
return
}
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.\\p{L}{2,}"
let predicate = NSPredicate(format: "SELF MATCHES [c] %@", emailRegex)
let isValid = predicate.evaluate(with: text)
UIView.animate(withDuration: 0.2) {
textField.layer.borderColor = isValid
? UIColor.systemGreen.cgColor
: UIColor.systemRed.cgColor
textField.layer.borderWidth = 1.0
textField.layer.cornerRadius = 6.0
}
}
Preguntas frecuentes
Use el método delegado shouldChangeCharactersInRange. Calcule la nueva longitud del texto como existingText.count + newText.count - range.length y devuelva false si se supera el límite. Alternativamente: suscríbase al evento editingChanged mediante addTarget y trunque el texto usando textField.text = String(text.prefix(maxLength)).
Verifique: isUserInteractionEnabled = true (por defecto), el delegado no devuelve false en shouldBeginEditing. Si el campo está dentro de un UIScrollView, desactive delaysContentTouches. Si el campo está en un controlador modal, verifique que no esté bloqueando los toques. Para SwiftUI UIViewRepresentable, verifique que el campo se convierta correctamente en firstResponder mediante DispatchQueue.main.async.
Agregue un UITapGestureRecognizer en self.view o scrollView con un target-action que llame a view.endEditing(true). Alternativa: textField.resignFirstResponder() para ocultar el teclado de un campo específico. Implemente touchesBegan en UIViewController o use la biblioteca IQKeyboardManager para la gestión automática del teclado. No olvide desactivar cancelsTouchesInView para el correcto funcionamiento de los botones.
Color del texto: textField.textColor = UIColor.label. Fuente: textField.font = UIFont.systemFont(ofSize: 16, weight: .regular). Color del placeholder: textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes: [.foregroundColor: UIColor.secondaryLabel]).
Tres formas: isEnabled = false (cambia la apariencia), isUserInteractionEnabled = false (conserva el estilo visual), o devuelva false en el delegado textFieldShouldBeginEditing. El tercer método es preferible — bloquea la entrada sin cambiar el estilo visual. Para establecer texto mediante programación en modo de solo lectura, use el delegado.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también