UITextField — 개요, 입력 필드 설정 및 작동 원리

저자: IT Sectr 게시일: 2026-07-06 읽는 시간: 8 분

UITextField는 iOS에서 한 줄 텍스트 입력을 위한 표준 UIKit 구성 요소이며, UIControl을 상속하고 다양한 키보드 모드를 지원합니다. Apple Developer 문서(2025)에 따르면 UITextField는 shouldBeginEditing, shouldChangeCharactersInRange 및 shouldReturn 콜백이 있는 UITextFieldDelegate를 제공합니다. UITextView와 달리 UITextField는 입력을 한 줄로 제한하고 사용자 정의 컨트롤을 위해 secureTextEntry, leftView 및 rightView를 지원합니다. 이것은 iOS 애플리케이션에서 인증 양식, 검색, 등록 및 데이터 입력을 위한 주요 요소입니다.

주요 내용

  • UITextField — 델리게이트 지원 및 사용자 정의 키보드를 갖춘 한 줄 UIKit 입력 필드
  • UIKeyboardType — 12가지 키보드 유형: numberPad, emailAddress, URL, phonePad 등
  • UITextFieldDelegate — shouldBegin/End/Change 콜백을 통한 입력 수명 주기 관리
  • Secure Text Entry — isSecureTextEntry를 통한 비밀번호 입력 모드 (문자를 점으로 대체)
  • Left/Right View — UX 개선을 위한 입력 필드 내 사용자 정의 아이콘 및 버튼

UITextField란

UITextField는 사용자가 한 줄 텍스트를 입력할 수 있도록 설계된 UIKit 프레임워크의 클래스입니다. 이 클래스는 UIControl을 상속하여 target-action 메커니즘을 통해 입력 이벤트를 구독할 수 있습니다: addTarget(self, action: Selector("textChanged:"), for: editingChanged). UITextField는 테두리(borderStyle), 필드가 비어 있을 때 플레이스홀더 텍스트, 지우기 버튼(clearButtonMode)을 표시하고 왼쪽/오른쪽 보조 뷰를 포함할 수 있습니다. 필드는 becomeFirstResponder 및 resignFirstResponder를 통해 포커스를 얻거나 잃을 때 자동으로 키보드를 표시/숨깁니다. 필드 크기는 글꼴 및 테두리 스타일에 따라 intrinsicContentSize에 의해 결정됩니다. Interface Builder(Storyboard/XIB)에서 UITextField를 만들려면 Object Library를 사용하고, 프로그래밍 방식으로는 초기화자 UITextField(frame: CGRect)를 사용합니다. 이 클래스는 최신 iOS 아키텍처와 완전히 호환됩니다: Combine publishers, UIViewRepresentable을 통한 SwiftUI의 @Published 및 양식을 위한 Diffable Data Source.

UIKeyboardType 키보드 유형

UITextField는 keyboardType 속성을 통해 12가지 키보드 유형을 지원합니다. 각 유형은 특정 입력 시나리오에 맞게 문자 세트를 최적화합니다. UIKeyboardType.default — 표준 QWERTY 키보드. UIKeyboardType.numberPad — 추가 기호 없이 숫자만 (PIN 코드 및 전화 번호에 이상적). UIKeyboardType.emailAddress — 메인 레이어에 @와 점이 있는 키보드. UIKeyboardType.URL — 메인 레이어에 .com, / 및 점이 있는 키보드. UIKeyboardType.phonePad — 전화 번호 입력을 위한 +, *, #이 있는 숫자 키패드. UIKeyboardType.decimalPad — 가격 입력을 위한 소수점이 있는 숫자. UIKeyboardType.webSearch — 검색 쿼리에 최적화된 Go 버튼이 있는 키보드. UIKeyboardType.asciiCapable — 라틴 문자용 ASCII 문자만. becomeFirstResponder를 호출하면 키보드가 나타나고 resignFirstResponder를 호출하면 사라집니다. 키보드 유형은 편집 중에 동적으로 변경할 수 있습니다.

유형시나리오특징
default일반 텍스트 입력표준 QWERTY
numberPadPIN, 코드숫자 0-9만
emailAddress이메일메인 레이어에 @와 .
URL웹 주소메인에 .com, /, .
phonePad전화숫자, +, *, #
decimalPad가격, 숫자숫자 + 소수점

UITextFieldDelegate 및 그 메서드

UITextFieldDelegate는 입력의 여러 단계에서 텍스트 필드의 동작을 정의하는 프로토콜입니다. 주요 메서드: textFieldShouldBeginEditing(textField) — 편집 시작을 허용하거나 거부하는 Bool을 반환합니다; textFieldDidBeginEditing — 키보드가 나타난 후 호출됩니다; textFieldShouldEndEditing — 편집을 완료할 수 있는지 확인합니다(false인 경우 필드가 포커스를 잃지 않음); textFieldDidEndEditing — 키보드가 사라진 후 호출됩니다; textFieldShouldChangeCharactersInRange — 각 문자 입력 시 호출되며 입력을 필터링할 수 있습니다(하나의 문자만 허용, false를 반환하면 문자가 추가되지 않음); textFieldShouldReturn — Return/Go/Next/Search를 누를 때 호출되며 다음 필드로 이동하는 데 사용됩니다. 델리게이트는 Optional이 아닙니다: 모든 메서드에는 기본 구현이 있지만 사용자 정의 동작을 위해서는 해당 메서드를 재정의해야 합니다.

shouldReturn을 통한 포커스 관리

shouldReturn 메서드는 양식 필드 간 탐색을 위한 표준 패턴입니다. 구현: textFieldShouldReturn(textField) — 어떤 textField가 이벤트를 트리거했는지 확인하고 becomeFirstResponder()를 통해 다음 필드로 포커스를 이동합니다. 마지막 필드인 경우 resignFirstResponder()를 호출하여 키보드를 숨깁니다. 필드 참조를 저장하려면 각 필드에 대해 IBOutlet collection 또는 개별 IBOutlet을 사용하세요.

Secure Text Entry 및 사용자 정의 left/right 뷰

isSecureTextEntry — UITextField의 속성으로, true일 때 입력 문자를 점(•)으로 대체하고 UIMenuController를 통한 텍스트 복사를 차단합니다. 비밀번호 필드, PIN 코드, CVV에 사용됩니다. 보안 모드와 일반 텍스트(show/hide password) 간 전환 시 textField.isSecureTextEntry.toggle()을 설정합니다. 중요: isSecureTextEntry를 변경하면 필드 텍스트가 재설정되므로 미리 저장하세요. LeftViewRightView는 입력 필드 내부 왼쪽 또는 오른쪽에 표시되는 사용자 정의 UIView입니다. 일반적인 사용: leftView에 검색 아이콘, rightView에 "지우기" 버튼. 구성: textField.leftViewMode = always(항상) 또는 whileEditing(편집 중에만). left/right 뷰는 패딩을 고려하여 텍스트 필드 내에 자동으로 배치됩니다. 뷰 크기는 bounds 또는 Auto Layout을 통해 설정됩니다.

swift
import UIKit

class LoginViewController: UIViewController {
    let passwordField = UITextField()

    override func viewDidLoad() {
        super.viewDidLoad()
        passwordField.isSecureTextEntry = true
        passwordField.placeholder = "Password"
        passwordField.keyboardType = .asciiCapable
        passwordField.delegate = self

        // 비밀번호 표시/숨기기 사용자 정의 버튼
        let showButton = UIButton(type: .system)
        showButton.setTitle("표시", for: .normal)
        showButton.addTarget(self, action: #selector(togglePasswordVisibility),
                       for: .touchUpInside)
        passwordField.rightView = showButton
        passwordField.rightViewMode = .always
    }

    @objc func togglePasswordVisibility() {
        passwordField.isSecureTextEntry.toggle()
    }
}

UITextInputTraits 구성

UITextInputTraits는 UITextField의 키보드 시각적 및 동작적 모양을 정의하는 프로토콜입니다. 주요 속성: autocorrectionType (.default, .no, .yes) — 텍스트 자동 수정을 활성화 또는 비활성화합니다; autocapitalizationType (.none, .words, .sentences, .allCharacters) — 첫 문자에 대한 자동 대문자; spellCheckingType — 맞춤법 검사; returnKeyType (.done, .go, .next, .search, .send, .continue, .join, .route, .emergencyCall) — 키보드의 Return 버튼 텍스트; enablesReturnKeyAutomatically — 필드가 비어 있을 때 Return 버튼 자동 비활성화. 이름 입력 필드에는 autocapitalizationType = .words, 이메일에는 autocorrectionType = .no, URL에는 keyboardType = .URL + autocapitalizationType = .none을 사용합니다. Traits는 필드 초기화 후 표시 전에 구성됩니다. Traits를 동적으로 변경하면 다음 표시 시 키보드가 업데이트됩니다.

Return Key Type 및 양식 탐색

Return Key Type은 키보드의 버튼 텍스트를 정의합니다: Next — 다음 필드로 이동, Done — 입력 완료, Search — 검색 시작, Send — 양식 제출, Continue — 계속 작성. shouldReturn 델리게이트 메서드와 결합하여 returnKeyType은 자연스러운 UX를 제공합니다: 사용자가 필드를 작성하고 Next를 눌러 다음으로 이동하며 마지막 필드에서 Done을 눌러 제출합니다. 버튼 텍스트 사용자 정의를 위해 iOS 15+에서 UIButtonConfiguration을 사용하세요.

플레이스홀더, 서식 및 입력 마스크

UITextField 플레이스홀더는 필드가 비어 있을 때 회색으로 표시되는 텍스트입니다. 구성: textField.placeholder = "Enter email". 플레이스홀더의 색상과 글꼴을 사용자 정의하려면 NSAttributedString과 함께 attributedPlaceholder를 사용합니다. 입력 마스크는 델리게이트 메서드 shouldChangeCharactersInRange를 통해 구현되며 전화번호, 날짜, 신용카드 및 SNILS 형식을 지원합니다. 입력 마스크는 표시와 값을 분리할 수 있습니다: 사용자는 형식화된 텍스트(예: +7 (999) 999-99-99)를 보고 모델은 "79999999999"를 저장합니다. 구현 예: 마스크를 대체할 X 문자가 있는 문자열로 저장합니다. 각 입력 시 형식화된 문자열을 만들고 shouldChangeCharactersInRange에서 false를 반환하여 textField.text = formattedText를 통해 필드 텍스트를 대체합니다. 숫자의 경우 NumberFormatter와 decimal keyboardType을 사용합니다.

swift
extension LoginViewController: UITextFieldDelegate {
    func textFieldShouldReturn(
        textField: UITextField
    ) -> Bool {
        if textField == emailField {
            passwordField.becomeFirstResponder()
        } else if textField == passwordField {
            textField.resignFirstResponder()
            loginTapped()
        }
        return true
    }

    func textField(
        textField: UITextField,
        shouldChangeCharactersIn range: NSRange,
        replacementString string: String
    ) -> Bool {
        // 이메일 공백 차단
        if textField == emailField && string == " " {
            return false
        }
        // 비밀번호 길이 제한
        if textField == passwordField {
            let newLength = (textField.text?.count ?? 0) +
                string.count - range.length
            return newLength <= 32
        }
        return true
    }
}

코드 예제: 유효성 검사 및 양식

UITextField, 이메일 유효성 검사 및 시각적 피드백을 사용한 로그인 양식 구현의 전체 예제를 살펴보겠습니다. 양식에는 emailField(emailAddress 키보드, 자동 수정 없음)와 passwordField(secureTextEntry)의 두 필드가 있습니다. 유효성 검사는 shouldChangeCharactersInRange에서 수행되며 추가로 Login 버튼을 누를 때 수행됩니다. 시각적 피드백: 오류 시 빨간색 테두리(layer.borderColor), 성공 시 녹색. textFieldDidBeginEditing에서 편집 시작 시 테두리 재설정.

정규식을 사용한 이메일 유효성 검사

이메일 유효성 검사는 형식 "SELF MATCHES %@"의 NSPredicate와 기본 형식 확인을 위한 정규식을 사용하여 수행됩니다. 실제 이메일 존재 확인은 서버에서 수행해야 합니다. 고급 유효성 검사를 위해 SwiftValidators 라이브러리 또는 Combine publishers를 사용하세요. 예: NSPredicate(format: "SELF MATCHES [c] %@", emailRegex).evaluate(with: email). 필드 테두리는 부드러운 전환을 위해 애니메이션 블록을 통해 업데이트됩니다.

swift
func validateEmail(textField: UITextField) {
    guard let text = textField.text, !text.isEmpty else {
        textField.layer.borderColor = UIColor.clear.cgColor
        return
    }

    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.\\p{L}{2,}"
    let predicate = NSPredicate(format: "SELF MATCHES [c] %@", emailRegex)
    let isValid = predicate.evaluate(with: text)

    UIView.animate(withDuration: 0.2) {
        textField.layer.borderColor = isValid
            ? UIColor.systemGreen.cgColor
            : UIColor.systemRed.cgColor
        textField.layer.borderWidth = 1.0
        textField.layer.cornerRadius = 6.0
    }
}

자주 묻는 질문

UITextField에서 문자 수를 제한하는 방법은?

델리게이트 메서드 shouldChangeCharactersInRange를 사용하세요. 새 텍스트 길이를 existingText.count + newText.count - range.length로 계산하고 제한을 초과하면 false를 반환합니다. 대안: addTarget을 통해 editingChanged 이벤트를 구독하고 textField.text = String(text.prefix(maxLength))을 사용하여 텍스트를 자릅니다.

UITextField가 터치에 반응하지 않는 이유는?

확인 사항: isUserInteractionEnabled = true(기본값), 델리게이트가 shouldBeginEditing에서 false를 반환하지 않음. 필드가 UIScrollView 내부에 있으면 delaysContentTouches를 비활성화합니다. 필드가 모달 컨트롤러에 있으면 터치를 차단하지 않는지 확인합니다. SwiftUI UIViewRepresentable의 경우 DispatchQueue.main.async를 통해 필드가 올바르게 firstResponder가 되는지 확인합니다.

UITextField 외부를 탭하여 키보드를 숨기는 방법은?

self.view 또는 scrollView에 UITapGestureRecognizer를 추가하고 view.endEditing(true)를 호출하는 target-action을 설정합니다. 대안: 특정 필드의 키보드를 숨기려면 textField.resignFirstResponder(). UIViewController에서 touchesBegan을 구현하거나 IQKeyboardManager 라이브러리를 사용하여 자동 키보드 관리를 수행합니다. 버튼의 올바른 작동을 위해 cancelsTouchesInView를 비활성화하는 것을 잊지 마세요.

UITextField의 텍스트 색상과 글꼴을 변경하는 방법은?

텍스트 색상: textField.textColor = UIColor.label. 글꼴: textField.font = UIFont.systemFont(ofSize: 16, weight: .regular). 플레이스홀더 색상: textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes: [.foregroundColor: UIColor.secondaryLabel]).

UITextField를 읽기 전용으로 만드는 방법은?

세 가지 방법: isEnabled = false(모양이 변경됨), isUserInteractionEnabled = false(시각적 스타일 유지) 또는 textFieldShouldBeginEditing 델리게이트에서 false 반환. 세 번째 방법이 선호됩니다 — 시각적 스타일을 변경하지 않고 입력을 차단합니다. 읽기 전용 모드에서 프로그래밍 방식으로 텍스트를 설정하려면 델리게이트를 사용하세요.

요약

  • UITextField — UIControl을 상속하고 델리게이트 관리를 갖춘 한 줄 UIKit 입력 필드
  • UIKeyboardType — 다양한 시나리오를 위한 12가지 키보드 유형: email, URL, numberPad, phonePad
  • UITextFieldDelegate — 입력 관리를 위한 shouldBegin/End/Change/Return 메서드가 있는 프로토콜
  • Secure Text Entry — isSecureTextEntry를 통한 비밀번호 모드 (문자를 점으로 대체)
  • Left/Right View — always/whileEditing 모드로 필드 내 사용자 정의 요소 (아이콘, 버튼)
  • Return Key Type — 양식 탐색을 위한 Return 버튼 구성: Next, Done, Search, Send
  • 유효성 검사 — shouldChangeCharactersInRange와 정규식을 통한, 테두리를 통한 시각적 피드백
  • 플레이스홀더는 사용자 정의 스타일링을 위해 NSAttributedString과 함께 attributedPlaceholder를 통해 구성됩니다

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기