[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라는 사용자 정의로 교체해야하는 “텍스트 필드”를 모르겠습니다.
답변
-
뷰 컨트롤러는
UITextFieldDelegate
아래와 같이을 준수해야 합니다.class MyViewController: UIViewController, UITextFieldDelegate { }
-
텍스트 필드의 대리자를 설정합니다.
myTextField.delegate = self
-
뷰 컨트롤러에서 메소드를 구현하십시오.
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
}
}