[解決済み】SwiftでUITextView内にプレースホルダーテキストを追加しますか?
質問
の中にプレースホルダーを追加するにはどうすればよいですか?
UITextView
に設定できるものと同様です。
UITextField
の中で
Swift
?
解決方法は?
Swift 4にアップデートしました。
UITextView
は本来プレースホルダープロパティを持たないので、プログラム上で
UITextViewDelegate
メソッドを使用します。必要な動作に応じて、以下の#1または#2のいずれかを使用することをお勧めします。
注:どちらの方法でも
UITextViewDelegate
をクラスに設定し
textView.delegate = self
を使用して、テキストビューのデリゲートメソッドを使用します。
解決策その1 - ユーザーがテキストビューを選択すると同時にプレースホルダーを消したい場合。
まず
UITextView
の外観を模倣するため、薄い灰色に設定されています。
UITextField
のプレースホルダーテキストを作成します。そのためには
viewDidLoad
またはテキストビューの作成時に指定します。
textView.text = "Placeholder"
textView.textColor = UIColor.lightGray
そして、ユーザーがテキストビューを編集し始めると、テキストビューにプレースホルダーが含まれている場合(つまり、そのテキストカラーがライトグレーの場合)、ユーザーの入力に対応するためにプレースホルダーのテキストをクリアしてテキストカラーを黒に設定します。
func textViewDidBeginEditing(_ textView: UITextView) {
if textView.textColor == UIColor.lightGray {
textView.text = nil
textView.textColor = UIColor.black
}
}
そして、ユーザーがテキストビューの編集を終了し、それが最初のレスポンダとして辞任したとき、テキストビューが空であれば、プレースホルダーのテキストを再追加し、その色をライトグレーに設定することによって、プレースホルダーをリセットすることができます。
func textViewDidEndEditing(_ textView: UITextView) {
if textView.text.isEmpty {
textView.text = "Placeholder"
textView.textColor = UIColor.lightGray
}
}
解決策その2 - テキストビューが選択されていても、テキストビューが空の時は常にプレースホルダーを表示させたい場合。
まず、プレースホルダーを
viewDidLoad
:
textView.text = "Placeholder"
textView.textColor = UIColor.lightGray
textView.becomeFirstResponder()
textView.selectedTextRange = textView.textRange(from: textView.beginningOfDocument, to: textView.beginningOfDocument)
(注意: OPはビューをロードしたらすぐにテキストビューが選択されるようにしたかったので、上記のコードにテキストビューの選択を組み込みました。もし、これがあなたの望む動作ではなく、ビューのロード時にテキストビューを選択させたくない場合は、上記のコードの塊から最後の2行を削除してください)。
次に
shouldChangeTextInRange
UITextViewDelegate
というメソッドがあります。
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
// Combine the textView text and the replacement text to
// create the updated text string
let currentText:String = textView.text
let updatedText = (currentText as NSString).replacingCharacters(in: range, with: text)
// If updated text view will be empty, add the placeholder
// and set the cursor to the beginning of the text view
if updatedText.isEmpty {
textView.text = "Placeholder"
textView.textColor = UIColor.lightGray
textView.selectedTextRange = textView.textRange(from: textView.beginningOfDocument, to: textView.beginningOfDocument)
}
// Else if the text view's placeholder is showing and the
// length of the replacement string is greater than 0, set
// the text color to black then set its text to the
// replacement string
else if textView.textColor == UIColor.lightGray && !text.isEmpty {
textView.textColor = UIColor.black
textView.text = text
}
// For every other case, the text should change with the usual
// behavior...
else {
return true
}
// ...otherwise return false since the updates have already
// been made
return false
}
を実装し、さらに
textViewDidChangeSelection
を使用して、プレースホルダが表示されている間にユーザーがカーソルの位置を変更できないようにします。(注
textViewDidChangeSelection
はビューがロードされる前に呼び出されるため、ウィンドウが表示されている場合にのみテキストビューの色をチェックします)。
func textViewDidChangeSelection(_ textView: UITextView) {
if self.view.window != nil {
if textView.textColor == UIColor.lightGray {
textView.selectedTextRange = textView.textRange(from: textView.beginningOfDocument, to: textView.beginningOfDocument)
}
}
}
関連
-
[解決済み] 基本的なUIButtonをプログラムで作成するには?
-
[解決済み] AndroidでEditTextにプレースホルダーテキストを追加する
-
[解決済み] UILabel 内のテキストを縦に上部に揃える
-
[解決済み] セレクトボックスのプレースホルダーを作成するにはどうすればよいですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] UITextViewのプレースホルダー
-
[解決済み] iPhone UITextField - プレースホルダーの文字色を変更する
-
[解決済み】HTML5入力のプレースホルダの色をCSSで変更する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】印刷します。エントリ, ":CFBundleIdentifier", Does Not Exist
-
[解決済み] swiftで「floor」が使用できない
-
[解決済み] 新しい Swift クラスの void 関数で予期しない非 void の戻り値が発生する。
-
[解決済み] Xcodeで "No such module "というエラーが出るが、フレームワークはある
-
[解決済み] UICollectionView: 非Nilのレイアウトパラメータで初期化する必要があります。
-
[解決済み] iOS HTTP GET リクエストを実行できません -Error Domain=NSURLErrorDomain Code=-1012
-
[解決済み] Xcode 4のBundle creator OS Type code ?
-
[解決済み] iOS 9 : ユニバーサルアプリの警告「アプリがフルスクリーンを必要としない限り、すべてのインターフェイスの向きをサポートする必要があります」。
-
[解決済み] なぜSwiftでUIViewControllerのデフォルトのsuper.init()を呼び出すことができないのでしょうか?
-
[解決済み] UITextViewのプレースホルダー