質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

657閲覧

UITextViewにフォーカスがあたっていても任意の文字を入力するまではプレースホルダを表示させるようにしたい。

ZY.

総合スコア22

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/02/15 18:07

編集2021/02/17 16:15

前提・実現したいこと

UITextViewにプレースホルダを表示させるようにしたのですが、現在の状態ではUITextViewにフォーカスがあてられたときはプレースホルダの文字が表示されなくなってしまいます。
フォーカスがあたっているときにはプレースホルダは表示させ、1文字でも入力があった場合にはプレースホルダを非表示にさせるようにしたいです。

該当のソースコード

swift

1 2class PostViewController: UIViewController { 3 4 @IBOutlet weak var textView: UITextView! 5 fileprivate let placeholder: String = "文字を入力してください" // プレースホルダ 6 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 self.textView.delegate = self 12 13 if textView.text.isEmpty { 14 textView.textColor = .darkGray 15 textView.text = placeholder 16 } 17 18 // 遷移時にtextViewにフォーカスをあてる 19 self.textView.becomeFirstResponder() 20 } 21 22 23 24 25 26extension PostViewController: UITextViewDelegate { 27 28 func textViewDidBeginEditing(_ textView: UITextView) { 29 if textView.text == placeholder { 30 textView.text = nil 31 textView.textColor = .darkText 32 } 33 } 34 35 func textViewDidEndEditing(_ textView: UITextView) { 36 if textView.text.isEmpty { 37 textView.textColor = .darkGray 38 textView.text = placeholder 39 } 40 } 41}

いただいたご回答から試したこと

Storyboardで配置していたUITextViewに対してUITextViewのクラスファイル(InspectableTextView)を作り、
ご回答いただいた下記ページを参考に試してみましたが、プレースホルダを表示させることができませんでした。

今回の対象となるViewControllerのクラスではUITextViewをIBOutletでつなげて、UITextViewに対して処理を加えているのですが、こちらがInspectableTextViewの処理と相互干渉してしまってうまくいっていないのでしょうか。
そもそも@IBDesignableの使い方が間違えているのでしょうか。

[Swift 4.2 UITextViewにプレースホルダーを追加するiOS 12 ...

【補足】
@IBDesignableについて不勉強だったこともあり、下記ページも参考にしました。
@IBDesignable使ってXcodeのAttributes Inspectorで設定 ...

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ご質問内容の先頭文

「UITextViewにプレースホルダを表示させるようにしたのですが、現在の状態ではUITextViewにフォーカスがあてられたときはプレースホルダの文字が表示されなくなってしまいます。」

そのまま検索に入れてみると、二番目の結果に

  • [Swift 4.2 UITextViewにプレースホルダーを追加するiOS 12 ...

とありますが、これはお試しになりましたでしょうか。

ちなみに、Swift 5系列でもそのまま使えることは確認しました。


ご提示いただいているご自身のコードを拝見する限り、ご希望の希望は Qiita のコード中で実現されていて、利用する側としては

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 @IBOutlet weak var textView: InspectableTextView! 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 // Do any additional setup after loading the view. 9 textView.localizedString = "ここに文字を入力してください。" 10 } 11}

localizedStringを設定すれば、自動的にプレースホルダーがつくようになっています。
プレースホルダーに表示される文字色も、適切に変化するようになっています。

これにたとえば、入力の状況に応じて背景色を変えたいというカスタマイズが必要になるかもしれませんし、他の delegate method を使う必要も出てくるかもしれません。その場合はご自身で delegate を設定されるよりも、参考にされたコードの extension として書かれた方がスマートかもしれません。

投稿2021/02/16 02:04

編集2021/02/18 05:27
TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ZY.

2021/02/17 16:16

ご回答有り難うございます。 いただいた回答から試したことを追記しました。
hoshi-takanori

2021/02/18 02:11

追記の InspectableTextView は自分自身を delegate にすることによって入力された時に placeholder の表示・非表示を切り替えてますので、ViewController を delegate にするとそれがうまくいかなくなりますが、ViewController の textViewDidChange から InspectableTextView の textViewDidChange を呼べば良いのでは。
TsukubaDepot

2021/02/18 05:29

公開されているコードの著作権にもよりますが、nspectableTextView の delegate を直接変更するのも一つかな、と思っていますがいかがでしょうか。もちろん、これを外部に公開するとなると、出典表示や、場合によってはオリジナル作者の確認は必要かもしれませんが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問