나는 textField를 작성했으며 43/35와 같이 텍스트의 서식을 지정하려고합니다. 번호/번호 - 신용 카드 월 및 연도입니다.Swift. TextField의 형식 입력
숫자를 사용할 수도 있고 어떻게 더 쉽게 할 수 있습니까? 새로운 문자를 추가하고 2 번째 문자를 제거하면 3 번째 문자를 교체해야하는 문제가 있습니다. 내가 어떤 제 3 자 라이브러리를 사용하지 않을
, 나는이 내 현재의 솔루션입니다 기본 구현을
나는 textField를 작성했으며 43/35와 같이 텍스트의 서식을 지정하려고합니다. 번호/번호 - 신용 카드 월 및 연도입니다.Swift. TextField의 형식 입력
숫자를 사용할 수도 있고 어떻게 더 쉽게 할 수 있습니까? 새로운 문자를 추가하고 2 번째 문자를 제거하면 3 번째 문자를 교체해야하는 문제가 있습니다. 내가 어떤 제 3 자 라이브러리를 사용하지 않을
, 나는이 내 현재의 솔루션입니다 기본 구현을
이 필요합니다. 기본적으로 다음을 수행해야합니다 나는의 ViewController에 구현 아래
1)
2) textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
구현) 내 코드에 (어딘가에 textfield
의 delegate
를 구현합니다. 숫자 형식이 작동하지 않도록
class ViewController: UIViewController {
@IBOutlet weak var textfield: UITextField!
let mask = "##/##"
override func viewDidLoad() {
super.viewDidLoad()
textfield.delegate = self
}
}
extension ViewController: UITextFieldDelegate {
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard let normalText = textField.text else { return false }
let beginning = textField.beginningOfDocument
// save cursor location
let cursorLocation = textField.positionFromPosition(beginning, offset: range.location + string.characters.count)
let newString = (normalText as NSString).stringByReplacingCharactersInRange(range, withString: string)
let newStringClean = newString.stringWithOnlyNumbers().withMask(mask)
guard newString != newStringClean else { return true }
textField.text = newStringClean
guard string != "" else { return false }
// fix cursor location after changing textfield.text
if let cL = cursorLocation {
let textRange = textField.textRangeFromPosition(cL, toPosition: cL)
textField.selectedTextRange = textRange
}
return false
}
}
extension String {
func stringWithOnlyNumbers() -> String {
return self.characters.reduce("") { (acc, c) -> String in
guard c.isDigit() else { return acc }
return "\(acc)\(c)"
}
}
func withMask(mask: String) -> String {
var resultString = String()
let chars = self.characters
let maskChars = mask.characters
var stringIndex = chars.startIndex
var maskIndex = mask.startIndex
while stringIndex < chars.endIndex && maskIndex < maskChars.endIndex {
if (maskChars[maskIndex] == "#") {
resultString.append(chars[stringIndex])
stringIndex = stringIndex.successor()
} else {
resultString.append(maskChars[maskIndex])
}
maskIndex = maskIndex.successor()
}
return resultString
}
}
extension Character {
func isDigit() -> Bool {
let s = String(self).unicodeScalars
let uni = s[s.startIndex]
let digits = NSCharacterSet.decimalDigitCharacterSet()
let isADigit = digits.longCharacterIsMember(uni.value)
return isADigit
}
}
마지막 글자를 제거하고 3 글자 만 클릭하면 텍스트 필드에 글자가 하나 밖에 남지 않습니다. – user7065798
수정 : 다시 작성한 값을 보호 문자열로 바꾸십시오! = ""else {return false} – user7065798
tks @ user7065798! 나는 그것을 거기 고쳤다. – ghashi
그것은 숫자가 아니다 :
는 다음 코드의 끝에서 볼 수 있듯이 나는, 문자열 및 문자에 대한 몇 가지 확장을 만들어 마스크를 적용합니다. 사용자가 입력 할 때 또는 텍스트를 입력 한 후에 서식을 지정 하시겠습니까? – rmaddy음, 사용자 유형으로 입력하겠습니다. – user7065798
어떻게 할 수 있습니까? – user7065798