프로젝트하면서 주민등록 번호나 면허증번호 등의 정보를 보정하는 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()
            }
        }
    }

+ Recent posts