【Swift/UIKit】UITextViewに文字数の入力制限を設ける方法!
この記事からわかること
- SwiftのUITextViewに文字数の入力制限を設定する方法
- UITextViewDelegateのtextView(_:shouldChangeTextIn:replacementText:)の使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
参考文献:[Swift]UITextViewで指定の文字数以上入力できないようにする(リアルタイムで入力内容をチェックする)
環境
- Xcode:15.0.1
- iOS:17.1
- Swift:5.9
- macOS:Sonoma 14.1
UITextViewに文字数の入力制限を設ける方法
SwiftのUITextView
で入力される文字数に制限を設定するにはUITextViewDelegate
に準拠させてtextView(_:shouldChangeTextIn:replacementText:)
デリゲートメソッドを使用して以下のように実装します。
inputTextView.delegate = self
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
// 変更された後の文字数を算出する
let changedCnt = textView.text.count - range.length + text.count
// 30文字制限を設けたい場合は以下のように実装する
return changedCnt <= 30
}
textView(_:shouldChangeTextIn:replacementText:)
公式リファレンス:textView(_:shouldChangeTextIn:replacementText:)
optional func textView(
_ textView: UITextView,
shouldChangeTextIn range: NSRange,
replacementText text: String
) -> Bool
textView(_:shouldChangeTextIn:replacementText:)
はユーザーの操作した変更をUITextViewのテキストに反映させるかどうかを真偽値で返すデリゲートメソッドです。
引数から取得できる値
- textView:変化前のUITextViewを参照(現在のテキストを取得できる)
- range:元のテキストの文字数から削除される文字数
- text:新しく追加されるテキストの文字数
textView(_:shouldChangeTextIn:replacementText:)
が呼ばれるのは入力or削除された直後なので引数から参照できるUITextViewは変更前のテキストを保持しているので注意が必要です。なので変更前のテキストの文字数と入力or削除される文字数から更新予定の文字数を算出し、指定した文字数より大きければfalse
を返すことでUITextView
が更新されなくなります。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。