programing

최대 길이 UITextField

lastcode 2023. 4. 22. 09:32
반응형

최대 길이 UITextField

UITextField에 입력할 수 있는 최대 글자 수를 swift로 설정하는 방법?시험해 보니 10자를 모두 사용해도 지울 수 없습니다.

제가 할 수 있는 일은 조작을 취소하는 것 뿐입니다(모든 문자를 함께 삭제).

키보드를 차단하지 않는 방법(다른 문자/기호/숫자는 추가할 수 없지만 백스페이스를 사용할 수 있음)을 아는 사람이 있습니까?

Swift 5 및 iOS 12에서는 다음 구현 방법을 사용해 보십시오.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
}
  • 이 코드의 가장 중요한 부분은 from의 변환입니다.range(NSRange)에 대해서rangeOfTextToReplace(Range<String.Index>이 변환이 중요한 이유에 대해서는, 이 비디오 튜토리얼을 참조해 주세요.
  • 이 코드가 올바르게 동작하도록 하려면 , 다음의 설정도 실시할 필요가 있습니다.textField에 대한 의 가치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
    }

}

저는 이렇게 합니다.

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
}

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 원본 답변 보기

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

마지막 문자를 덮어쓰려면:

let maxLength = 10

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if range.location > maxLength - 1 {
        textField.text?.removeLast()
    }

    return true
}

스위프트 5

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField == myTextFieldName {
        if range.location > 10 {
            return false
        }
    }
    return true
}

또는

func textFieldDidChangeSelection(_ textField: UITextField) {
    myTextFieldName.text = String(myTextFieldName.text!.prefix(10))
}

스위프트 5

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let MAX_LENGTH = 4
        let updatedString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
        return updatedString.count <= MAX_LENGTH
    }

다음 방법으로 솔루션을 게시했습니다.IBInspectable따라서 인터페이스 빌더 또는 프로그래밍 방식으로 최대 길이 값을 변경할 수 있습니다.여기를 봐주세요

swift 5 또는 swift 4로 사용할 수 있습니다.

  1. 뷰 컨트롤러에서 텍스트 필드 추가
  2. View Controller에 텍스트 연결
  3. View Controller에서 코드 추가

     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

대리인은 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)

        }

이 투고에 기재되어 있는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. 이 프로토콜 확장자를 구현하려면 문자 제한을 지정해야 합니다.이는 일반적으로 ViewController가 됩니다만, 문자 제한을 계산 속성으로 구현하고 다른 문자 제한을 반환할 수 있습니다(예: 모델 중 하나에서 문자 제한).

2. 텍스트 필드의 should Change Characters In Range 위임 메서드 내에서 이 메서드를 호출해야 합니다.그렇지 않으면 false 등을 반환하여 텍스트 입력을 차단할 수 없습니다.

3. 백스페이스 문자를 통과시키는 것이 좋습니다.그래서 백스페이스를 감지하는 기능을 추가했습니다.should Change Characters 메서드는 이를 확인하고 '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 repo를 이용해 문자 제한 동작을 iOS 프레임워크에 포함시켰습니다.Twitter와 같은 문자 제한 표시를 통해 문자 제한을 얼마나 초과했는지 알 수 있는 프로토콜이 있습니다.

Github에서의 문자 제한 프레임워크

나는 이것을 사용하고 있다.

3글자 제한

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        if let txt = textField.text {
            let currentText = txt + string
            if currentText.count > 3 {
                return false
            }
            return true
        }
        return true
    }

Swift 5.0에서 iOS 14+와 Xcode 12+를 사용하는 간단한 답변입니다.

»viewDidLoad()하다

override func viewDidLoad() {
    // Add a target for myTextField, pointing to .editingDidChange
    myTextField.addTarget(self, action: #selector(myTextFieldDidChange(_:)), for: .editingChanged)
}

클래스 내 어딘가에 옵션 문자 제한을 추가할 수도 있습니다.

// Add an optional character limit
let characterLimit = 100

그리고 수업 후반부에 다음 기능을 추가하세요.

@objc func myTextFieldDidChange(_ textField: UITextField) {
    textField.text = String(textField.text!.prefix(self.characterLimit))
}

이렇게 하면 입력할 때 또는 텍스트 필드에 텍스트를 복사하여 붙여넣을 때 문자가 제한됩니다.

기존 문자열과 입력이 10보다 큰지 확인해야 합니다.

   func textField(textField: UITextField!,shouldChangeCharactersInRange range: NSRange,    replacementString string: String!) -> Bool {
      NSUInteger newLength = textField.text.length + string.length - range.length;
      return !(newLength > 10)
   }

언급URL : https://stackoverflow.com/questions/25223407/max-length-uitextfield

반응형