私が試したときどのようにすばやいを使用してUITextFieldに入力できる最大文字数を設定しますか?、10文字全部使ってしまうと消せないことがわかりました。
私ができる唯一のことは、操作をキャンセルすることです(すべての文字を一緒に削除します)。
誰かがキーボードをブロックしない方法を知っていますか?
私が試したときどのようにすばやいを使用して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
の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
}
}
text.characters.count
使用は非推奨ですtext.count
私はそれをこのようにします:
func checkMaxLength(textField: UITextField!, maxLength: Int) {
if (countElements(textField.text!) > maxLength) {
textField.deleteBackward()
}
}
コードは私にとってはうまくいきます。しかし、私は絵コンテで作業します。ストーリーボードで、編集の変更時にビューコントローラーのテキストフィールドにアクションを追加します。
@Martinの回答から詳細を追加
// linked your button here
@IBAction func mobileTFChanged(sender: AnyObject) {
checkMaxLength(sender as! UITextField, maxLength: 10)
}
// linked your button here
@IBAction func citizenTFChanged(sender: AnyObject) {
checkMaxLength(sender as! UITextField, maxLength: 13)
}
func checkMaxLength(textField: UITextField!, maxLength: Int) {
// swift 1.0
//if (count(textField.text!) > maxLength) {
// textField.deleteBackward()
//}
// swift 2.0
if (textField.text!.characters.count > maxLength) {
textField.deleteBackward()
}
}
Swift 4で
テキストフィールドの10文字の制限と削除を許可(バックスペース)
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == userNameFTF{
let char = string.cString(using: String.Encoding.utf8)
let isBackSpace = strcmp(char, "\\b")
if isBackSpace == -92 {
return true
}
return textField.text!.count <= 9
}
return true
}
func checkMaxLength(textField: UITextField!, maxLength: Int) {
if (textField.text!.characters.count > maxLength) {
textField.deleteBackward()
}
}
IOS 9の小さな変更
スウィフト3
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let nsString = NSString(string: textField.text!)
let newText = nsString.replacingCharacters(in: range, with: string)
return newText.characters.count <= limitCount
}
UITextFieldを拡張して、@IBInspectable
それを処理するためのオブジェクトを追加できます。
SWIFT 5
import UIKit
private var __maxLengths = [UITextField: Int]()
extension UITextField {
@IBInspectable var maxLength: Int {
get {
guard let l = __maxLengths[self] else {
return 150 // (global default-limit. or just, Int.max)
}
return l
}
set {
__maxLengths[self] = newValue
addTarget(self, action: #selector(fix), for: .editingChanged)
}
}
@objc func fix(textField: UITextField) {
if let t = textField.text {
textField.text = String(t.prefix(maxLength))
}
}
}
その後、属性インスペクターで定義します
Swift 4の元の回答を参照してください
私はを使用してソリューションを投稿したIBInspectable
ので、インターフェイスビルダーまたはプログラムの両方で最大長の値を変更できます。ここで確認してください
あなたは次のように迅速5またはSWIFT 4で使用することができます 怒鳴るようなイメージの外観
ビューViewControllerにコードを追加します
class ViewController: UIViewController , UITextFieldDelegate {
@IBOutlet weak var txtName: UITextField!
var maxLen:Int = 8;
override func viewDidLoad() {
super.viewDidLoad()
txtName.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if(textField == txtName){
let currentText = textField.text! + string
return currentText.count <= maxLen
}
return true;
}
}
GitHubからフルソースフォームをダウンロードできます: https : //github.com/enamul95/TextFieldMaxLen
この投稿で言及されているUITextFieldの元に戻すバグに注意してください:UITextField の最大文字長を設定します
ここであなたはそれを迅速に修正する方法です
if(range.length + range.location > count(textField.text)) {
return false;
}
Here is my version of code. Hope it helps!
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let invalidCharacters = NSCharacterSet(charactersInString: "0123456789").invertedSet
if let range = string.rangeOfCharacterFromSet(invalidCharacters, options: nil, range:Range<String.Index>(start: string.startIndex, end: string.endIndex))
{
return false
}
if (count(textField.text) > 10 && range.length == 0)
{
self.view.makeToast(message: "Amount entry is limited to ten digits", duration: 0.5, position: HRToastPositionCenter)
return false
}
else
{
}
return true
}
私は自分のアプリの1つでこのプロトコル/拡張機能を使用しており、もう少し読みやすくなっています。私はそれがバックスペースをどのように認識し、文字がバックスペースであるかを明示的に伝える方法が好きです。
考慮すべき事項:
1.このプロトコル拡張を実装するものはすべて、文字制限を指定する必要があります。通常、これはViewControllerになりますが、計算されたプロパティとして文字制限を実装し、他の何かを返すことができます。たとえば、モデルの1つの文字制限などです。
2.テキストフィールドのshouldChangeCharactersInRangeデリゲートメソッド内でこのメソッドを呼び出す必要があります。そうしないと、falseを返すなどしてテキスト入力をブロックできなくなります。
3.おそらくバックスペース文字を通過させたいでしょう。そのため、バックスペースを検出するための関数を追加しました。shouldChangeCharactersメソッドはこれをチェックし、早い段階で 'true'を返すことができるため、常にバックスペースを許可できます。
protocol TextEntryCharacterLimited{
var characterLimit:Int { get }
}
extension TextEntryCharacterLimited{
func charactersInTextField(textField:UITextField, willNotExceedCharacterLimitWithReplacementString string:String, range:NSRange) -> Bool{
let startingLength = textField.text?.characters.count ?? 0
let lengthToAdd = string.characters.count
let lengthToReplace = range.length
let newLength = startingLength + lengthToAdd - lengthToReplace
return newLength <= characterLimit
}
func stringIsBackspaceWith(string:String, inRange range:NSRange) -> Bool{
if range.length == 1 && string.characters.count == 0 { return true }
return false
}
}
興味のある方がいれば、私はGithubリポジトリを持っています。この文字制限動作の一部を取り、iOSフレームワークに入れました。Twitterのような文字制限表示を取得するために実装できるプロトコルがあり、文字制限をどれだけ超えたかが表示されます。
デリゲートは1対1の関係であり、他の理由で他の場所で使用したい場合があるため、テキストフィールドの長さを制限して、セットアップ内にこのコードを追加します。
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
setup()
}
required override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
func setup() {
// your setup...
setMaxLength()
}
let maxLength = 10
private func setMaxLength() {
addTarget(self, action: #selector(textfieldChanged(_:)), for: UIControlEvents.editingChanged)
}
@objc private func textfieldChanged(_ textField: UITextField) {
guard let text = text else { return }
let trimmed = text.characters.prefix(maxLength)
self.text = String(trimmed)
}
既存の文字列と入力の合計が10より大きいかどうかを確認する必要があります。
func textField(textField: UITextField!,shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
NSUInteger newLength = textField.text.length + string.length - range.length;
return !(newLength > 10)
}