프로젝트하면서 주민등록 번호나 면허증번호 등의 정보를 보정하는 UI가 필요했다.
각 필드마다 숫자와 자릿수를 정해서 입력 받게 하기 위해서 정규식을 적용해 보자.
키보드에서 키를 클릭시 newText 문자를 정규식에 대입해서 정규식에 맞는 동작을 실행한다.
이름의 경우 한글/영문 0자리 이상
주민번호의 경우 앞자리 숫자 6자리 까지만 입력되고 뒷자리 7자리 까지 입력 된다.
extension String {
func getStringRegex(pattern: String) -> Bool {
if let regex = try? NSRegularExpression(pattern: pattern) {
return regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: self.count)) != nil
}
return false
}
}
extension ResultViewController: UITextFieldDelegate {
// text가 변경할지에 대한 delegate 요청 메서드
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
print("shouldChangeCharactersIn: \((textField.text) ?? "Empty")")
let newText = (textField.text as! NSString).replacingCharacters(in: range, with: string)
log(direction: .ETC, ofType: self, datas: ">>>> 1",
textField.text,
string,
newText,
range)
// 정규식 참고사이트 https://nsios.tistory.com/139
/// 이름
if textField.tag == tag_NAME {
// 한글 / 영문만 입력 가능
let pattern = "^[가-힣ㄱ-ㅎㅏ-ㅣa-zA-Z]{0,}$"
if newText.getStringRegex(pattern: pattern) {
return true
} else {
return false
}
} /// 발행일자
else if textField.tag == tag_ISSUEDDATA {
// 숫자만 입력 되게 처리 및 날짜형식 맞는지 확인 8 자릿수
let pattern = "^[0-9]{0,8}$"
if newText.getStringRegex(pattern: pattern) {
return true
} else {
return false
}
} /// 주민등록 번호
else if textField.tag == tag_RRN1 {
// 숫자만 입력 및 자릿수 확인 6자
let pattern = "^[0-9]{0,6}$"
if newText.getStringRegex(pattern: pattern) {
return true
} else {
return false
}
} else if textField.tag == tag_RRN2 {
// 숫자만 입력 및 자릿수 확인 7자
let pattern = "^[0-9]{0,7}$"
if newText.getStringRegex(pattern: pattern) {
return true
} else {
return false
}
} /// 운전면허 번호
else if textField.tag == tag_LICENSE1 {
// 숫자만 입력 및 자릿수 확인 2자
let pattern = "^[0-9]{0,2}$"
if newText.getStringRegex(pattern: pattern) {
return true
} else {
return false
}
} else if textField.tag == tag_LICENSE2 {
// 숫자만 입력 및 자릿수 확인 2자
let pattern = "^[0-9]{0,2}$"
if newText.getStringRegex(pattern: pattern) {
return true
} else {
return false
}
} else if textField.tag == tag_LICENSE3 {
// 숫자만 입력 및 자릿수 확인 6자
let pattern = "^[0-9]{0,6}$"
if newText.getStringRegex(pattern: pattern) {
return true
} else {
return false
}
} else if textField.tag == tag_LICENSE4 {
// 숫자만 입력 및 자릿수 확인 2자
let pattern = "^[0-9]{0,2}$"
if newText.getStringRegex(pattern: pattern) {
return true
} else {
return false
}
}
return true
}
}
TextField의 입력 포커스가 해제될 경우 현재 입력된 값이 정상적인지 재확인하고 틀렸을 경우 재입력하게 다시 TextField 입력포커스 설정
예) tag_ISSUEDDATA 날짜형식이고 날짜 형식이 맞는지 확인하고 아닐 경우 재입력 휴도
// 입력포커스 해제시
func textFieldDidEndEditing(_ textField: UITextField) {
print("textFieldDidEndEditing: \((textField.text) ?? "Empty")")
var reWrite: Bool = false
// 날짜 형식이 맞는지 체크
if textField.tag == tag_ISSUEDDATA {
if textField.text?.toDate(format: "yyyyMMdd") == nil {
showPopup(message: "날짜형식이 아닙니다. 다시 입력해주세요.")
reWrite = true
}
} else if textField.tag == tag_RRN1 {
if textField.text?.count != 6 {
showPopup(message: "주민번호 앞자리는 6자 입니다. 다시 입력해주세요.")
reWrite = true
}
} else if textField.tag == tag_RRN2 {
if textField.text?.count != 7 {
showPopup(message: "주민번호 뒷자리는 7자 입니다. 다시 입력해주세요.")
reWrite = true
}
} else if textField.tag == tag_LICENSE1 {
if textField.text?.count != 2 {
showPopup(message: "운전면허 번호 첫 자리는 2자 입니다. 다시 입력해주세요.")
reWrite = true
}
} else if textField.tag == tag_LICENSE2 {
if textField.text?.count != 2 {
showPopup(message: "운전면허 번호 두번째 자리는 2자 입니다. 다시 입력해주세요.")
reWrite = true
}
} else if textField.tag == tag_LICENSE3 {
if textField.text?.count != 6 {
showPopup(message: "운전면허 번호 세번째 자리는 6자 입니다. 다시 입력해주세요.")
reWrite = true
}
} else if textField.tag == tag_LICENSE4 {
if textField.text?.count != 2 {
showPopup(message: "운전면허 번호 세번째 자리는 2자 입니다. 다시 입력해주세요.")
reWrite = true
}
}
if reWrite == true {
DispatchQueue.main.async {
textField.becomeFirstResponder()
}
}
}
'Swift > UITextField' 카테고리의 다른 글
[SWIFT]키보드 올라오는 속도에 맞춰 TextField 이동 (0) | 2023.06.15 |
---|---|
[SWIFT]IBDesignable Custom UITextField (0) | 2023.06.09 |
[SWIFT]입력된 텍스트 뒤에서 부터 하나씩 삭제하기 (0) | 2023.06.09 |
[SWIFT]키보드 handler Event TextField 키보드 위/아래 이동 (0) | 2023.06.09 |