1. ホーム
  2. アイオス

[解決済み】SwiftでUITextView内にプレースホルダーテキストを追加しますか?

2022-03-25 17:19:25

質問

の中にプレースホルダーを追加するにはどうすればよいですか? 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)
        }
    }
}