적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift iOS] UITextField 입력 글자 수 제한 및 백스페이스 감지

hongssup_ 2021. 7. 21. 00:25
반응형

UITextField를 이용하여 사용자 입력을 받아올 때, 글자수 입력을 제한하는 법을 알아보자. 

 

글자수 입력 제한하기

애플 문서를 찾아보면

textField(_:shouldChangeCharactersIn:replacementString:)

: Asks the delegate whether to change the specified text.

func textField(_ textField: UITextField, 
		shouldChangeCharactersIn range: NSRange, 
		replacementString string: String) -> Bool

textField의 텍스트와 새로 입력받은 string을 합쳐서 길이를 제한하는 메서드로, 결과값으로 Bool을 리턴하여 텍스트를 바꿀지 말지 결정한다. 

텍스트가 변경되어야할 때는 true를 반환, 텍스트 변화 없이 유지하고 싶을 때에는 false를 반환하여 입력되는 글자 수를 제한할 수 있다. 

 

+ 하지만 이렇게만 세팅을 해두면 글자수가 초과한 후에는 수정할 수가 없게 되어, Backspace가 입력되었을 때는 글자를 삭제할 수 있도록하는 코드를 위 메서드 내에 추가로 작성해주어야 한다. 

 

Backspace Event 감지하기

if let char = string.cString(using: String.Encoding.utf8) {
    let isBackSpace = strcmp(char, "\\b")
    if isBackSpace == -92 {
        return true
    }
}

 

textField에서 새로 입력되는 string 값이 Backspace인지 판단하고 인코딩하여 UInt32 형태로 변환. 

UInt32 형식의 backspace는 -92의 값을 가지므로 이 조건을 만족할 경우 사용자 입력이 가능하도록 리턴값을 수정해 준다.

 

다음과 같이 더 간단하게 구현할 수도 있다고 하는데 사용은 안해봐서 모르겠다. 

if string.isEmpty {
    return true
}

 

UITextField limit number of text & detect backspace event

참고 : https://taesulee.tistory.com/3, kasroid.github.io, 물먹고하자

StackOverflow_Why strcmp of backspace returns -92? 

 

728x90
반응형