Skip to content

TextView Delegate #7

Description

@happykwon

UITextViewDelegate 프로토콜은 UITextView의 행동을 관리하기 위해 사용된다.
사용자가 텍스트 뷰에서 작업을 할 때 다양한 상황에 대응하여 메서드를 호출하고 정의 할 수 있는 프로토콜이다.

대표적인 메서드

텍스트 변경 감지

textView(_:shouldChangeTextIn:replacementText:) 텍스트 뷰의 특정 범위에 텍스트를 변경하려 할 때 호출되며.

이 메서드는 변경을 허용할지 여부를 결정할 수 있다

//숫자만 입력할 수 있게 제한 
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    let allowedCharacters = CharacterSet.decimalDigits
    let characterSet = CharacterSet(charactersIn: text)
    return allowedCharacters.isSuperset(of: characterSet)
}

편집 시작 및 종료

textViewDidBeginEditing(_:) 텍스트 뷰가 편집 모드에 들어갔을 때 호출

// 편집 시 배경색을 회색으로 변경
func textViewDidBeginEditing(_ textView: UITextView) {
    textView.backgroundColor = UIColor.lightGray 
}

textViewDidEndEditing(_:) 텍스트 뷰가 편집 모드에서 나왔을 때 호출

// 편집 종료 후 배경색을 하얗게 변경
func textViewDidEndEditing(_ textView: UITextView) {
    textView.backgroundColor = UIColor.white 
}

텍스트 변경 시

textViewDidChange(_:) 텍스트 뷰의 텍스트가 변경될 때마다 호출, 사용자의 입력에 따라 동적으로 반응

// 최대 100자로 제한
func textViewDidChange(_ textView: UITextView) {
    if textView.text.count > 100 { 
        textView.text = String(textView.text.prefix(100))
    }
}

textViewDidChangeSelection(_:) 텍스트 뷰에서 선택된 텍스트 범위가 변경될 때 호출, 선택된 택스트에 따라 특정 동작을 수행 할 수 있게도 가능

func textViewDidChangeSelection(_ textView: UITextView) {
    print("현재 선택된 범위: \(textView.selectedRange)")
}
func textViewDidChangeSelection(_ textView: UITextView) {
    // 사용자가 텍스트를 선택
    if textView.selectedRange.length > 0 { 
        let startIndex = textView.text.index(textView.text.startIndex, offsetBy: textView.selectedRange.location)
        let endIndex = textView.text.index(startIndex, offsetBy: textView.selectedRange.length)
        let selectedText = String(textView.text[startIndex..<endIndex])

        // 선택된 텍스트를 이용한 작업 수행, 예를 들어 번역, 분석 등
        translateText(selectedText)
    }
}

func translateText(_ text: String) {
    // 번역 로직 구현
    print("번역할 텍스트: \(text)")
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions