Swift의 replacingCharacters로 텍스트 입력 필드 실시간 수정하기

작성일 :

Swift의 replacingCharacters로 텍스트 입력 필드 실시간 수정하기

Swift에서는 텍스트 입력 필드의 내용을 실시간으로 수정하거나 검증할 수 있는 여러 가지 방법이 있습니다. 그 중 하나가 replacingCharacters(in:with:) 메소드를 사용하는 것입니다. 이 메소드는 텍스트의 특정 부분을 대체할 수 있도록 해주며, 텍스트 필드에서 사용자의 입력을 즉각적으로 처리할 수 있게 해줍니다.

텍스트 필드 설정하기

먼저 기본적인 텍스트 필드를 설정합니다. Interface Builder에서 텍스트 필드를 추가하고 관련 아웃렛을 연결한 다음, 델리게이트를 설정합니다.

swift
import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
    }
}

UITextFieldDelegate 메소드 사용하기

텍스트 필드의 내용이 변경될 때마다 특정 행동을 수행하려면 UITextFieldDelegate 프로토콜의 textField(_:shouldChangeCharactersIn:replacementString:) 메소드를 사용합니다. 이 메소드는 사용자가 텍스트 필드에 새로운 문자를 입력하거나 기존 문자를 삭제할 때마다 호출됩니다.

swift
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // 현재 텍스트 필드의 텍스트
    guard let currentText = textField.text as NSString? else {
        return true
    }

    // 문자열을 대체
    let newString = currentText.replacingCharacters(in: range, with: string)

    // 새로운 문자열을 사용하여 원하는 작업 수행
    print("New String: \(newString)")

    // true를 반환하여 텍스트 필드의 텍스트를 업데이트
    return true
}

입력 형식 지정하기

replacingCharacters(in:with:) 메소드를 사용하여 사용자의 입력을 특정 형식으로 제한할 수 있습니다. 예를 들어, 사용자가 입력한 전화번호를 실시간으로 포맷팅할 수 있습니다.

swift
func formatPhoneNumber(_ number: String) -> String {
    let cleanedNumber = number.replacingOccurrences(of: "[^0-9]", with: "", options: .regularExpression)
    let length = cleanedNumber.count
    
    if length <= 3 {
        return cleanedNumber
    } else if length <= 6 {
        return "(\(cleanedNumber.prefix(3))) \(cleanedNumber.suffix(length - 3))"
    } else {
        let areaCode = cleanedNumber.prefix(3)
        let middle = cleanedNumber[cleanedNumber.index(cleanedNumber.startIndex, offsetBy: 3)..<cleanedNumber.index(cleanedNumber.startIndex, offsetBy: 6)]
        let last = cleanedNumber.suffix(length - 6)
        return "(\(areaCode)) \(middle)-\(last)"
    }
}

위 함수를 textField(_:shouldChangeCharactersIn:replacementString:) 메소드 내부에서 호출하여 포맷팅된 문자열을 다시 입력 필드에 반영합니다.

swift
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let currentText = textField.text as NSString? else {
        return true
    }

    let newString = currentText.replacingCharacters(in: range, with: string)
    let formattedString = formatPhoneNumber(newString)
    textField.text = formattedString

    return false
}

return false를 반환하여 텍스트 필드의 텍스트가 수동으로 업데이트되도록 합니다. 이렇게 하면 사용자가 입력한 전화번호가 실시간으로 포맷팅된 형태로 텍스트 필드에 표시됩니다.

유효성 검사

사용자의 입력이 특정 조건을 만족하도록 제한할 수도 있습니다. 예를 들어, 사용자가 입력한 내용이 숫자로만 구성되어 있는지 검사할 수 있습니다.

swift
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let currentText = textField.text as NSString? else {
        return true
    }

    let newString = currentText.replacingCharacters(in: range, with: string)
    guard !newString.isEmpty else {
        return true
    }

    let characterSet = CharacterSet(charactersIn: "0123456789").inverted
    let filtered = string.components(separatedBy: characterSet).joined(separator: "")
    return string == filtered
}

이 코드는 사용자가 입력한 내용이 숫자가 아닌 경우 입력을 무시하도록 합니다. 이를 통해 특정 형식의 입력만 허용할 수 있습니다.

결론

replacingCharacters(in:with:) 메소드를 사용하면 텍스트 필드에서 사용자의 입력을 실시간으로 처리하여 원하는 형식으로 변환하거나 유효성을 검사할 수 있습니다. 이를 활용하면 보다 직관적이고 사용자 친화적인 UI를 구현할 수 있습니다.