テキストフィールドオブジェクトにネイティブで見つかる「プレースホルダー」機能を追加する、UITextViewの非常にシンプルなサブクラスがあります。これがサブクラスの私のコードです:
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
}
}
}
UITextView
アイデンティティインスペクタでオブジェクトのクラスをに変更した後、属性インスペクタでプロパティをうまくPlaceholderTextView
設定できPlaceholder
ます。アプリを実行するとコードは適切に機能しますが、インターフェイスビルダーにプレースホルダーテキストは表示されません。また、次の非ブロッキングエラーが発生します(これが、デザイン時にレンダリングされない理由です)。
エラー:IB Designables:自動レイアウトステータスの更新に失敗しました:Interface Builder Cocoa Touch Toolがクラッシュしました
エラー:IB Designables:PlaceholderTextViewのインスタンスのレンダリングに失敗しました:ビューのレンダリングに200ミリ秒以上かかりました。描画コードのパフォーマンスが低下する可能性があります。
これらのエラーの原因を特定できません。2番目のエラーは、drawRect()をオーバーライドしていないため、意味がありません。何か案は?