J'ai une sous-classe très simple de UITextView qui ajoute la fonctionnalité "Placeholder" que vous pouvez trouver native à l'objet Text Field. Voici mon code pour la sous-classe:
import UIKit
import Foundation
@IBDesignable class PlaceholderTextView: UITextView, UITextViewDelegate
{
@IBInspectable var placeholder: String = "" {
didSet {
setPlaceholderText()
}
}
private let placeholderColor: UIColor = UIColor.lightGrayColor()
private var textColorCache: UIColor!
override init(frame: CGRect) {
super.init(frame: frame)
self.delegate = self
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.delegate = self
}
func textViewDidBeginEditing(textView: UITextView) {
if textView.text == placeholder {
textView.text = ""
textView.textColor = textColorCache
}
}
func textViewDidEndEditing(textView: UITextView) {
if textView.text == "" && placeholder != "" {
setPlaceholderText()
}
}
func setPlaceholderText() {
if placeholder != "" {
if textColorCache == nil { textColorCache = self.textColor }
self.textColor = placeholderColor
self.text = placeholder
}
}
}
Après avoir changé la classe de l' UITextView
objet dans l'inspecteur d'identité sur PlaceholderTextView
, je peux définir la Placeholder
propriété très bien dans l'inspecteur d'attributs. Le code fonctionne très bien lors de l'exécution de l'application, mais n'affiche pas le texte d'espace réservé dans le générateur d'interface. J'obtiens également les erreurs non bloquantes suivantes (je suppose que c'est pourquoi il n'est pas rendu au moment de la conception):
erreur: IB Designables: échec de la mise à jour de l'état de la mise en page automatique: Interface Builder Cocoa Touch Tool a planté
erreur: IB Designables: échec du rendu de l'instance de PlaceholderTextView: le rendu de la vue a pris plus de 200 ms. Votre code de dessin peut souffrir de performances lentes.
Je ne suis pas en mesure de comprendre la cause de ces erreurs. La deuxième erreur n'a aucun sens, car je ne remplace même pas drawRect (). Des idées?