[ios] 최대 길이 UITextField

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>). 이 변환이 중요한 이유를 이해하려면 이 비디오 자습서 를 참조하십시오 .
  • 이 코드가 제대로 작동하도록하려면 textFieldsmartInsertDeleteType값 도로 설정해야 합니다 UITextSmartInsertDeleteType.no. 이렇게하면 붙여 넣기 작업을 수행 할 때 (원치 않는) 추가 공간이 삽입되는 것을 방지 할 수 있습니다.

어떻게 구현하는 방법을 보여줍니다 아래의 완전한 샘플 코드 textField(_:shouldChangeCharactersIn:replacementString:)A의 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
    }

}


답변

나는 이것을 이렇게한다 :

func checkMaxLength(textField: UITextField!, maxLength: Int) {
    if (countElements(textField.text!) > maxLength) {
        textField.deleteBackward()
    }
}

코드는 나를 위해 작동합니다. 하지만 저는 스토리 보드로 작업합니다. Storyboard에서 변경된 편집시 뷰 컨트롤러의 텍스트 필드에 대한 작업을 추가합니다 .


답변

Swift 4 업데이트

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
     guard let text = textField.text else { return true }
     let newLength = text.count + string.count - range.length
     return newLength <= 10
}


답변

@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
    }