1. ホーム
  2. ios

[解決済み] UITextFieldの最大長

2022-06-01 08:16:01

質問

私が試したところ swiftを使用してUITextFieldに入力できる最大文字数を設定する方法を教えてください。 を試したところ、10文字全部使うと文字も消せなくなることがわかりました。

キャンセル(全文字まとめて消す)しかできないのですが。

キーボードを塞がない方法(他の文字/記号/数字を追加できないが、バックスペースは使えるようにする)をご存知の方はいらっしゃいますか?

どのように解決するのですか?

Swift 5 と iOS 12 で、次のような実装を試してみてください。 textField(_:shouldChangeCharactersIn:replacementString:) メソッドの一部である UITextFieldDelegate プロトコルの一部です。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let textFieldText = textField.text,
        let rangeOfTextToReplace = Range(range, in: textFieldText) else {
            return false
    }
    let substringToReplace = textFieldText[rangeOfTextToReplace]
    let count = textFieldText.count - substringToReplace.count + string.count
    return count <= 10
}

  • このコードで最も重要な部分は range ( NSRange ) から rangeOfTextToReplace ( Range<String.Index> ). これを見る ビデオチュートリアル を参照し、この変換がなぜ重要であるかを理解してください。
  • このコードを正しく動作させるためには、このコードの前に textField 's smartInsertDeleteType の値を UITextSmartInsertDeleteType.no . これにより、貼り付け操作の実行時に(不要な)余分なスペースが挿入される可能性を防ぐことができます。

以下の完全なサンプルコードでは textField(_:shouldChangeCharactersIn:replacementString:) の中に UIViewController :

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
        textField.delegate = self
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        guard let textFieldText = textField.text,
            let rangeOfTextToReplace = Range(range, in: textFieldText) else {
                return false
        }
        let substringToReplace = textFieldText[rangeOfTextToReplace]
        let count = textFieldText.count - substringToReplace.count + string.count
        return count <= 10
    }

}