私が試したときSwift を使用して UITextField に入力できる最大文字数を設定するにはどうすればよいでしょうか?、10文字すべてを使用すると、文字を消去することもできないことがわかりました。
私にできる唯一のことは、操作をキャンセルすることです(すべての文字をまとめて削除します)。
キーボードをブロックしない方法(他の文字/記号/数字を追加できないが、バックスペースを使用できるようにする方法)を知っている人はいますか?
ベストアンサー1
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
}
}