< 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 |