최대 길이 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))
}
}
}
그 후 속성 검사기로 정의합니다.
@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로 사용할 수 있습니다.
- 뷰 컨트롤러에서 텍스트 필드 추가
- View Controller에 텍스트 연결
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와 같은 문자 제한 표시를 통해 문자 제한을 얼마나 초과했는지 알 수 있는 프로토콜이 있습니다.
나는 이것을 사용하고 있다.
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
'programing' 카테고리의 다른 글
Azure 웹사이트의 사이트에서 X509 Certificate 2 처리가 실패함 (0) | 2023.04.22 |
---|---|
Excel 선택과 활성화 (0) | 2023.04.22 |
차트의 반복 호출.SetSourceData 오류 1004 발생 (0) | 2023.04.22 |
Xcode 10: 이 실행 파일의 올바른 프로비저닝 프로파일을 찾을 수 없습니다. (0) | 2023.04.22 |
Windows에서 ssh-add를 실행하는 방법 (0) | 2023.04.22 |