iOS/iOS FastCampus

번역기앱) textview delegate 사용

Developer-Michelle 2023. 6. 20. 17:53

< textview delegate 사용 관련 >

 

1. textViewDidBeginEditing

import UIKit
import SnapKit

final class SourceTextViewController: UIViewController {
    private let placeholderText = "텍스트 입력"
    
    private lazy var textView: UITextView = {
        let textView = UITextView()
        textView.text = placeholderText
        textView.textColor = .secondaryLabel
        textView.font = .systemFont(ofSize: 18.0, weight: .semibold)
        textView.returnKeyType = .done
        textView.delegate = self
        
        return textView
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .systemBackground
        
        view.addSubview(textView)
        textView.snp.makeConstraints {
            $0.edges.equalToSuperview().inset(16.0)
        }
    }
}

extension SourceTextViewController: UITextViewDelegate {
    func textViewDidBeginEditing(_ textView: UITextView) { //사용자가 무언가를 입력하려고 '텍스트입력' 메모장을 딱 탭했을 때
        guard textView.textColor == .secondaryLabel else { return }
        textView.text = nil
        textView.textColor = .label
    }
}

 

처음에 placeholder 처럼 .secondaryLabel 컬러로 '텍스트입력' 이라고 써져있는 곳에 

사용자가 탭을 하는 순간 'textDidBeginEditing' 이걸 textViewDelegate에서 선언.

 

그리고 애초에 textView.delegate = self 이걸 해줘야 위의 함수 기능을 쓸 수 있다.

 

2. shouldChangeTextIn

extension SourceTextViewController: UITextViewDelegate {
    
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if text == 완료를 눌렀을 때의 키값 {
            dismiss(animated: true)
        } else {
            return true
        }
    }
    
}

사용자가 무언가를 번역하려고 텍스트입력창에다가 ㅇㄹㄴㅁㅇㄹㅁㄴㅇㄹㄴㅁㅇㄹ 라고 친 다음에 '완료'를 눌렀을 때 내려가게 하는 코드. 즉 dismiss(animated:true) 실행

 

위에 코드는 결국 정리해서 쓰자면 아래와 같이 쓸 수 있다.

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        guard text == "\n" else { return true }
            dismiss(animated: true)
            return true
    }

위에서 textView.resignResponder()를 안써도 되는 이유?

키보드가 viewcontroller에 종속되어있으므로 해당 textview를 dismiss 시켜버리면 키보드도 한꺼번에 내려가기 때문.

'iOS > iOS FastCampus' 카테고리의 다른 글

번역기앱) enum의 활용  (0) 2023.06.20
SwiftUI Enum 을 활용한 리팩토링 깔끔하게.  (0) 2023.06.05