안녕하세요. 린다입니다.
오늘은 TextField에 입력받는걸 제한하는 방법을 블로깅 하려고 해요.
사실 별거 아닌줄 알았는데 단순하게 char의 정규표현식으로만 하니까 안 돼서 ..
은근히 고생을 해가지구 빠르게 블로깅하고 가려고 합니다.
방법은 TextField의 onchange를 통해서 입력값을 판별해주면 돼요.
현재 입력값인 newValue를 koreaLangCheck이라는 함수를 통해서
판별을 하고, 조건에 따라서 규칙를 판별해주고 있는 코드입니다.
TextField("닉네임을 입력해주세요", text: $nickname)
.customTF(type: .normal) // 커스텀 조건
.onChange(of: nickname) { newValue in
if koreaLangCheck(newValue) {
nicknameRules = .allow
} else {
nicknameRules = .reject
}
if newValue.count > 5 || newValue.count < 1 {
nicknameRules = .defult
}
}
koreaLangCheck 함수는 이렇게 하시면 됩니다.
func koreaLangCheck(_ input: String) -> Bool {
let pattern = "^[가-힣a-zA-Z\\s]*$"
if let regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) {
let range = NSRange(location: 0, length: input.utf16.count)
if regex.firstMatch(in: input, options: [], range: range) != nil {
return true
}
}
return false
}
함수를 설명해보자면
1) NSRegularExpression을 사용하여 패턴을 가진 정규식 객체 생성 (대소문자 구분 없이)
2) 입력 문자열의 길이를 UTF-16 형식의 문자 수로 얻은 후, NSRange를 사용하여 입력 문자열의 범위를 지정
3) 정규식 객체를 사용하여 입력 문자열의 범위에 대해 첫 번째 일치 항목 찾기
4) 첫 번째 일치 항목이 발견되면 true를 반환하고, 그렇지 않으면 false를 반환
즉, 해당 input이 패턴에 알맞는 항목이면 true, 아니면 false를 반환하는 함수입니다.
해당 패턴은 온전한 한글과 영어만 통과하는 패턴이에요.
(ㅇㅇ과 같은 한글 초성 불가능, 숫자 및 특수문자 불가능)
실제로 nicknameRules와 함께 동작은 이렇게 합니다.
'Swift > SwiftUI' 카테고리의 다른 글
SwiftUI, Layout과 Alignment을 알아보자 (2019 WWDC) (1) | 2024.03.28 |
---|---|
SwiftUI, Custom TextEditor 만들기 (0) | 2024.03.20 |
SwiftUI, Line Height 명확하게 설정하기 (feat, linespacing) (0) | 2024.03.02 |
SwiftUI로 Apple Login 구현 시 Button Custom을 쉽게 구현하는 방법 - (.blendMode 사용기) (0) | 2024.02.09 |
SwiftUI로 무한 스와이프 카드/스택 카드 구현하기 (0) | 2024.02.08 |