Comment ajouter un placeholder dans UITextView sur Swift : guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi UITextView n'a pas de placeholder intégré et comment contourner ce problème

\n\n

Chaque développeur iOS qui a déjà travaillé avec UITextView a rencontré le même problème : contrairement à UITextField, UITextView n'a pas de propriété placeholder intégrée. Vous créez un champ de saisie multiligne, vous lancez l'application — et vous voyez un rectangle blanc vide. L'utilisateur ne comprend pas ce qu'il doit saisir, et le designer n'est pas content.

\n\n

Pourquoi Apple n'a-t-elle pas ajouté cette propriété ? Historiquement, UITextView était conçu comme un élément pour afficher et éditer de grands volumes de texte (par exemple, des notes ou des e-mails), et non comme un champ de saisie avec une indication. Mais les temps ont changé : aujourd'hui, nous utilisons UITextView pour les commentaires, les descriptions, les biographies — partout où un placeholder est nécessaire.

\n\n

Dans cet article, nous allons voir 3 méthodes éprouvées pour ajouter un placeholder text inside UITextView in Swift. Vous apprendrez comment le faire via UILabel, via les attributs NSAttributedString et via la création de votre propre sous-classe. C'est parti !

\n\n

Méthode 1 : UILabel classique par-dessus UITextView

\n\n

La méthode la plus simple et la plus compréhensible consiste à placer un UILabel par-dessus UITextView et à gérer sa visibilité. Cette méthode est idéale pour les débutants et pour les projets qui ne nécessitent pas de personnalisation complexe.

\n\n

Comment ça fonctionne

\n\n

Vous ajoutez un UILabel comme élément enfant de UITextView, vous définissez son texte de placeholder et vous le masquez lorsque l'utilisateur commence à taper. Voici un exemple étape par étape :

\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 = "Saisissez votre commentaire..."\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

Important : n'oubliez pas de définir le délégué UITextViewDelegate et d'implémenter la méthode textViewDidChange. Si vous utilisez SwiftUI, l'approche sera différente — on utilise le modificateur .overlay.

\n\n

Avantages et inconvénients

\n
    \n
  • Avantages : simplicité, facilité de compréhension, fonctionne sur toutes les versions d'iOS.
  • \n
  • Inconvénients : il faut surveiller les contraintes si les insets du textview changent. Ne fonctionne pas non plus si le textview utilise un NSAttributedString avec différents alignements.
  • \n
\n\n

Méthode 2 : Placeholder via NSAttributedString

\n\n

Une méthode plus élégante consiste à utiliser les attributs de chaîne. L'idée est d'afficher le placeholder comme un texte attribué en gris, puis de le remplacer par du texte normal lorsque l'utilisateur commence à saisir.

\n\n

Cette méthode est particulièrement utile si vous travaillez avec UITextView en Swift et que vous ne voulez pas vous embêter avec des vues supplémentaires.

\n\n

Implémentation

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

Blogs

Book Recommendations