[ios] Swift에서 UITextField의 최대 문자 길이 설정

나는 이것에 다른 주제가 있다는 것을 알고 있지만 그것을 구현하는 방법을 찾을 수없는 것 같습니다.

UITextField를 5 자로 제한하려고합니다.

가급적 영숫자 및-및. 및 _

나는이 코드를 보았다

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange,
                       replacementString string: String) -> Bool
{
    let maxLength = 4
    let currentString: NSString = textField.text
    let newString: NSString =
             currentString.stringByReplacingCharactersInRange(range, withString: string)
    return newString.length <= maxLength
}

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

    let length = count(textField.text.utf16) + count(string.utf16) - range.length
    return length <= 10
}

실제로 구현하는 방법이나 UITextField라는 사용자 정의로 교체해야하는 “텍스트 필드”를 모르겠습니다.



답변

  1. 뷰 컨트롤러는 UITextFieldDelegate아래와 같이을 준수해야 합니다.

    class MyViewController: UIViewController, UITextFieldDelegate {
    
    }
    
  2. 텍스트 필드의 대리자를 설정합니다. myTextField.delegate = self

  3. 뷰 컨트롤러에서 메소드를 구현하십시오. textField(_:shouldChangeCharactersInRange:replacementString:)

모두 함께:

class MyViewController: UIViewController,UITextFieldDelegate  //set delegate to class

@IBOutlet var mytextField: UITextField             //  textfield variable

override func viewDidLoad() {
    super.viewDidLoad()
    mytextField.delegate = self                  //set delegate
}


func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange,
                       replacementString string: String) -> Bool
{
    let maxLength = 4
    let currentString: NSString = textField.text
    let newString: NSString =
             currentString.stringByReplacingCharactersInRange(range, withString: string)
    return newString.length <= maxLength
}

Swift 4의 경우

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let maxLength = 1
    let currentString: NSString = (textField.text ?? "") as NSString
    let newString: NSString =
        currentString.replacingCharacters(in: range, with: string) as NSString
    return newString.length <= maxLength
}

지정된 텍스트 필드에 지정된 문자 집합 만 입력하도록 허용

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
  var result = true

  if mytextField == numberField {
    if count(string) > 0 {
      let disallowedCharacterSet = NSCharacterSet(charactersInString: "0123456789.-").invertedSet
      let replacementStringIsLegal = string.rangeOfCharacterFromSet(disallowedCharacterSet) == nil
      result = replacementStringIsLegal
    }
  }

  return result
}

최대 길이의 숫자 입력 만받는 iOS 텍스트 필드를 프로그래밍하는 방법


답변

2017 년 12 월. Swift 4.

주의해야 이 문제에 대해 온라인으로 볼 수있는 예제 코드의 대부분은 아주 오래된입니다 .

프로젝트의 Swift 파일에 다음을 붙여 넣으십시오. 파일 이름은 무엇이든 가능합니다 (예 : “Handy.swift”).

이것은 마침내 iOS에서 가장 어리석은 문제 중 하나를 수정합니다.

여기에 이미지 설명 입력

이제 텍스트 필드에 .maxLength.

개발 중에 스토리 보드에서 해당 값을 설정하거나 앱이 실행되는 동안 코드에서 설정하는 것은 완전히 괜찮습니다.

// simply have this in any Swift file, say, Handy.swift

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)
        }
    }
    func fix(textField: UITextField) {
        let t = textField.text
        textField.text = t?.prefix(maxLength)
    }
}

그렇게 간단합니다.


각주-요즘 String에는 신속하게 안전하게 자르기 위해 간단하게.prefix(n)


더 간단한 일회성 버전 …

위는 프로젝트의 모든 텍스트 필드를 수정 합니다 .

특정 텍스트 필드 하나 를 “4”로만 제한 하고 싶은 경우 그게 …

class PinCodeEntry: UITextField {

    override func didMoveToSuperview() {

        super.didMoveToSuperview()
        addTarget(self, action: #selector(fixMe), for: .editingChanged)
    }

    @objc private func fixMe() { text = text?.prefix(4) }
}

휴! 그게 전부입니다.

(단지 BTW, UIText View 와 관련된 매우 유용한 팁 ,
https://stackoverflow.com/a/42333832/294884 )


OCD 프로그래머 (나와 같은)에게는 …

@LeoDabus가 상기시켜 주듯이 .prefix는 하위 문자열을 반환합니다. 당신이 엄청나게 관심이 있다면

let t = textField.text
textField.text = t?.prefix(maxLength)

될 것이다

if let t: String = textField.text {
    textField.text = String(t.prefix(maxLength))
}

즐겨!


답변

Swift 4, 간단히 사용 :

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    return range.location < 10
}


답변

Steven Schmatz가 한 것과 같은 방식이지만 Swift 3.0을 사용합니다.

//max Length
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange,
               replacementString string: String) -> Bool
{
    let maxLength = 4
    let currentString: NSString = textField.text! as NSString
    let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString
    return newString.length <= maxLength
}


답변

Swift 5의 경우 :
한 줄을 작성하여 최대 문자 길이를 설정하십시오.

 self.textField.maxLength = 10

자세한 내용은 여기를 클릭하세요

크레딧 : http://www.swiftdevcenter.com/max-character-limit-of-uitextfield-and-allowed-characters-swift/


답변

확장이 더 편리하다고 생각합니다. 여기에서 전체 답변보기

private var maxLengths = [UITextField: Int]()

// 2
extension UITextField {

  // 3
  @IBInspectable var maxLength: Int {
    get {
      // 4
      guard let length = maxLengths[self] else {
        return Int.max
      }
      return length
    }
    set {
      maxLengths[self] = newValue
      // 5
      addTarget(
        self,
        action: #selector(limitLength),
        forControlEvents: UIControlEvents.EditingChanged
      )
    }
  }

  func limitLength(textField: UITextField) {
    // 6
    guard let prospectiveText = textField.text
      where prospectiveText.characters.count > maxLength else {
        return
    }

    let selection = selectedTextRange
    // 7
    text = prospectiveText.substringWithRange(
      Range<String.Index>(prospectiveText.startIndex ..< prospectiveText.startIndex.advancedBy(maxLength))
    )
    selectedTextRange = selection
  }

}


답변

위에 게시 된 다른 솔루션은 텍스트 필드 맵으로 인해 유지주기를 생성합니다. 게다가 maxLength인위적인 Int.max구조 대신 설정하지 않으면 속성은 nullable이어야합니다 . maxLength가 변경되면 대상이 여러 번 설정됩니다.

이곳까지 메모리 누출 및 다른 수정을 방지하는 약한지도 Swift4 업데이트 된 용액을

private var maxLengths = NSMapTable<UITextField, NSNumber>(keyOptions: NSPointerFunctions.Options.weakMemory, valueOptions: NSPointerFunctions.Options.strongMemory)

extension UITextField {

    var maxLength: Int? {
        get {
            return maxLengths.object(forKey: self)?.intValue
        }
        set {
            removeTarget(self, action: #selector(limitLength), for: .editingChanged)
            if let newValue = newValue {
                maxLengths.setObject(NSNumber(value: newValue), forKey: self)
                addTarget(self, action: #selector(limitLength), for: .editingChanged)
            } else {
                maxLengths.removeObject(forKey: self)
            }
        }
    }

    @IBInspectable var maxLengthInspectable: Int {
        get {
            return maxLength ?? Int.max
        }
        set {
            maxLength = newValue
        }
    }

    @objc private func limitLength(_ textField: UITextField) {
        guard let maxLength = maxLength, let prospectiveText = textField.text, prospectiveText.count > maxLength else {
            return
        }
        let selection = selectedTextRange
        text = String(prospectiveText[..<prospectiveText.index(from: maxLength)])
        selectedTextRange = selection
    }
}