iOS 개발자라면 텍스트 필드(UITextField)와 그 동작을 다루는 방법을 반드시 알아야 합니다. Apple은 이를 위해 UITextFieldDelegate 프로토콜을 미리 제공하고 있습니다.
자세한 내용은 Apple 공식 문서(UITextFieldDelegate 문서)에서 확인할 수 있습니다.
회원가입 폼이나 설문 양식처럼 입력란이 있는 앱을 사용해 보셨다면, 타이핑할 때마다 현재 입력된 글자 수가 화면에 표시되거나 특정 글자 수로 제한되는 경우를 본 적이 있을 것입니다.
이번 포스팅에서는 바로 그 기능, 즉 텍스트 필드에 입력하는 동안 글자 수를 화면에 표시하는 방법을 단계별로 알아보겠습니다.
구현 순서
1단계 — 프로젝트 생성
Xcode를 열고 → New Project → Single View Application을 선택한 뒤, 프로젝트 이름을 "TextFieldCount"로 지정합니다.
2단계 — UI 구성
Main.storyboard를 열고 아래 이미지처럼 TextField와 Label을 배치합니다. 그다음 각 요소에 대한 @IBOutlet을 생성하여 레이블은 lblCount, 텍스트 필드는 txtInputBox로 이름짓습니다.

3단계 — 델리게이트 설정
ViewController.swift에서 UITextFieldDelegate 프로토콜을 채택하고, 텍스트 필드의 delegate를 self로 지정합니다.
class ViewController: UIViewController, UITextFieldDelegate {
txtInputBox.delegate = self4단계 — 델리게이트 메서드 구현
델리게이트 메서드 shouldChangeCharactersIn을 구현하고, 그 안에 다음 코드를 작성합니다.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if(textField == txtInputBox){
let strLength = textField.text?.count ?? 0
let lngthToAdd = string.count
let lengthCount = strLength + lngthToAdd
self.lblCount.text = "\(lengthCount)"
}
return true
}이 메서드는 사용자가 텍스트를 입력하거나 삭제할 때마다 호출됩니다. 기존 텍스트의 길이에 새로 입력될 문자열의 길이를 더한 값을 레이블에 표시하는 방식입니다.
5단계 — 실행 및 확인
애플리케이션을 빌드하고 실행하면, 텍스트 필드에 타이핑할 때마다 글자 수가 실시간으로 업데이트되는 것을 확인할 수 있습니다.
전체 예제 코드
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var txtInputBox: UITextField!
@IBOutlet var lblCount: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
txtInputBox.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if(textField == txtInputBox){
let strLength = textField.text?.count ?? 0
let lngthToAdd = string.count
let lengthCount = strLength + lngthToAdd
self.lblCount.text = "\(lengthCount)"
}
return true
}
}실행 결과

참고로 위 방식 외에도 editingChanged 이벤트를 활용하거나, Swift Combine의 퍼블리셔를 구독하는 방법 등으로도 동일한 기능을 구현할 수 있습니다. 상황과 프로젝트 구조에 맞는 방식을 선택하면 됩니다.