UITextFieldUITextFieldDelegate에 대해 알아보기 전에 먼저 TextField가 뭔지 다시 한번 알아보자!
애플 공식 문서 보러가기 🍎
텍스트 필드를 사용하여 화면 키보드를 사용하여 사용자로부터 텍스트 기반 입력을 수집할 수 있습니다. 키보드는 일반 텍스트,e-mail, 숫자 등 다양한 유형의 입력에 대해 구성할 수 있습니다. 텍스트 필드는target-actionmechanism 과delegateobject를 사용하여 편집 중에 변경된 내용을 보고합니다.
기본적인 텍스트 편집 동작 외에도 overlay view를 텍스트 필드에 추가하여 추가 정보를 표시하고 추가 탭 가능한 컨트롤을 제공할 수 있습니다. 책갈피 단추 또는 검색 아이콘과 같은 요소에 대한 사용자 정의 overlay view를 추가할 수 있습니다. 텍스트 필드는 현재 텍스트를 지우기 위한 overlay view를 기본 제공합니다. 사용자 지정 오버레이 보기 사용은 선택 사항입니다.

@MainActor class UITextField : UIControl
공식 문서에 있는 다양한 속성들을 변경해서 textField를 구성할 수 있다!

delegate? 🤨
object 의 책임을 넘기는 design pattern으로 sublassing 없이 객체를 재사용할 수 있다. 책임을 넘겨 유연한 구조를 만들 수 있다.
delegate pattern 은 Foundation, UIKit, Cocoa Touch 등 애플 프레임워크에서 광범위하게 활용되고 있다.주로 프레임워크 객체가 위임을 요청,커스텀 컨트롤러 객체가 위임을 받아 특정 이벤트에 대한 기능 구현사용 이유
서브클래싱(subclassing) 없이 나만의 기능을 구현 (resuing controls without subclassing)
클라이언트, 즉 delegate 에 일을 맡기는 쪽에서는 protocol 로 선언된 delegate 의 자격요건만 알고 protocol 의 메소드만 사용한다. delegate 객체는 delegate protocol을 준수한 구체적인 타입으로 클라이언트의 속성에 참조되어 사용된다.
클라이언트의 기능을 구체적으로 구현하기 위해 클라이언트 클래스의 하위클래스를 만들 필요 없이, delegate protocol 을 채택하는 delegate 가 될 구체적인 클래스에서 구체적 구현을 완료하여 클라이언트의 delegate 속성에 참조시키기만 하면 된다.
delegate 패턴의 목적은 subclass - 수직 상속 없이 각 객체의 event 에 대한 응답, 혹은 어떤 처리 방법을 각자 다르게 구현하기 위해서이다. Delegate protocol 을 준수하는 class or struct 에서 각 event 에 대해 응답하는 메소드를 구체적으로 구현하면 된다. delegate 가 없다면 각 이벤트마다 불릴 메소드를 하위 클래스에서 override 해야 한다. Delegate 의 자격 요건만 알고, 구체적인 동작은 몰라도 됨
UITextFieldDelegate애플 공식 문서 🍎
textField는 중요한 변경사항에 대한 응답으로 delegate 메서드를 호출합니다. 이러한 방법을 사용하여 사용자가 입력한 텍스트의 유효성을 검사하고 키보드와의 특정 상호 작용에 응답하며 전체 편집 프로세스를 제어할 수 있습니다. 편집은 텍스트 필드가 첫 번째 응답자가 되고 키보드(또는 할당된 input view)를 표시하기 직전에 시작됩니다.did / should / will
- did : 어떤 일 이미 일어났는데 그 뒤에 해야될 일 하라고 알려줌. 이미 완료되었다.
- should : 주로 어떤 일을 해도 되는지 delegate 에게 물어볼 때 사용됨
- will : 곧 어떤 일 일어날 건데 그 전에 완료되어야 할 일들 처리하라고 알려줄 때
// 대리자에게 특정 텍스트 필드의 문구를 편집해도 되는지 묻는 메서드 func textFieldShouldBeginEditing(UITextField) // 대리자에게 특정 텍스트 필드의 문구가 편집되고 있음을 알리는 메서드 func textFieldDidBeginEditing(UITextField) // 특정 텍스트 필드의 문구를 삭제하려고 할 때 대리자를 호출하는 메서드 func textFieldShouldClear(UITextField) // 특정 텍스트 필드의 `Return` 키가 눌렸을 때 대리자를 호출하는 메서드 func textFieldShouldReturn(UITextField)

텍스트 필드에 입력을 시작할 때 모서리에 외곽선이 생기고 다른 곳으로 옮기게 되면 (입력이 완료되면) 외곽선이 사라진다!
extension SignInViewController: UITextFieldDelegate{
func textFieldDidBeginEditing(_ textField: UITextField) {
textField.makeBorder(width: 0.7, color: .tvingGray1)
}
func textFieldDidEndEditing(_ textField: UITextField) {
textField.layer.borderWidth = 0
}
}
makeBorder는 UIView에 extension으로 작성해둔 함수이다.
extension UIView {
...
func makeBorder (width : CGFloat ,color : UIColor ) {
layer.borderWidth = width
layer.borderColor = color.cgColor
}
...
}