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>
). 이 변환이 중요한 이유를 이해하려면 이 비디오 자습서 를 참조하십시오 . - 이 코드가 제대로 작동하도록하려면
textField
의smartInsertDeleteType
값 도로 설정해야 합니다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
}