iOS) UITextField 글자 수 제한 구현하기
UITextField 에서 입력받을 글자 수를 제한해보자.
- 먼저 UITextField 의 텍스트가 변경될 때 옵저버에게 알릴 수 있도록 notification center 를 등록했다.
NotificationCenter.default.addObserver(self,
selector: #selector(textFieldDidChange(_:)),
name: UITextField.textDidChangeNotification,
object: nil)
UITextField.textDidChangeNotification
UITextField 의 텍스트가 변경될 때 observers 에게 알리는 notification
- textFieldDidChange(_:)
cardTitleTextField 의 텍스트가 변경될 때 maxLength(상수로 15를 지정해둔 상황) 보다 클 경우 더이상 입력되지 않도록 제한.
@objc
private func textFieldDidChange(_ notification: Notification) {
if let textField = notification.object as? UITextField {
switch textField {
case cardTitleTextField:
if cardTitleTextField.text?.count ?? 0 > maxLength {
cardTitleTextField.deleteBackward()
}
default:
return
}
}
}
그런데! 15자보다 긴 텍스트를 복사해서 붙여넣게 되면 아예 입력이 되지 않았다.
그래서 15자까지만 입력되도록 코드를 변경해보았다.
@objc
private func textFieldDidChange(_ notification: Notification) {
if let textField = notification.object as? UITextField {
switch textField {
case cardTitleTextField:
if let text = cardTitleTextField.text {
if text.count > maxLength {
// 🪓 주어진 인덱스에서 특정 거리만큼 떨어진 인덱스 반환
let maxIndex = text.index(text.startIndex, offsetBy: maxLength)
// 🪓 문자열 자르기
let newString = text.substring(to: maxIndex)
cardTitleTextField.text = newString
}
}
default:
return
}
}
}
substring(to:) 이 deprecated 됐으니까 partial range upto 연산자를 사용하라고 한다…
PartialRangeUpTo
A partial half-open interval up to, but not including, an upper bound.
라고 개발자 문서는 설명했는데요… 그니까.. 우리가 아주 잘 알고있는 ..<
입니다!
half-open range operator. 반개방 범위 연산자라고 불러지는데요. 범위에서 상위의 값을 포함하지 않는 범위를 의미합니다!
그러면 적용해볼까요?
let newString = text.substring(to: index)
// ->
let newString = String(text[text.startIndex..<maxIndex])