[iOS] UITextField 글자 수 제한하기

모리스·2023년 11월 20일
0

iOS

목록 보기
10/16
post-thumbnail

이번 노트에서는 UITextField로 text를 입력받을 때 글자 수를 제안하는 방법에 대해 작성해 보려한다.
예전에 React-Native로 앱을 개발할 땐 TextInput component에 maxLength를 지원해 간단히 조건만 추가해주면 됐는데 iOS에서는 이런 간단한 글자 수 제한조차 직접 다.... 구현해 줘야한다...ㅠ
입력 받는 text를 UITextFieldDelegate로 읽어와 글자 수를 제안하도록 할 것이다.


구현은 생각보다 간단하다. UITextFieldDelegateshouldChangeCharactersIn delegate를 사용한다.

override func textField(_ textFeild: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
	guard textField.text!.count < 10 else { return false }
    return true
}

끝이다. 생각보다 간단하다.
그런데 한가지 문제가 있다. 10자리 제한 조건에 걸렸을 때, text를 수정하려 backspace를 누르면 backspace가 동작하지 않는다.
이유는 backspace도 text이기 때문이다. 10자리가 초과 됐을 시 backspace도 text로 인지돼 guard 문에서 걸러진다.
이를 해결하기 위해 backspace를 거르도록 처리해줘야한다.

override func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
	// backspace 처리
	if let char = string.cString(using: String.Encoding.utf8) {
    	let isBackSpace = strcmp(char, "\\b")
        if isBackSpace == -92 {
        	return true
        }
    }
    guard textField.text!.count < 10 else { return false }
    return true
}

backspace는 \b문자로 표기되고, \b를 UInt32로 변환하면 -92의 값을 가진다. backspace의 값이 들어오면 true를 반환하도록 구현하면 10개의 문자가 입력돼도 backspace는 정상 동작하는걸 볼 수있다.

profile
모바일 앱 개발 노트 :)

0개의 댓글