[iOS/UIKit] UITextFieldDelegate

Zoe·2023년 4월 12일

🧼 UIKit

목록 보기
5/6
post-thumbnail

UITextField

UITextFieldDelegate에 대해 알아보기 전에 먼저 TextField가 뭔지 다시 한번 알아보자!

애플 공식 문서 보러가기 🍎
텍스트 필드를 사용하여 화면 키보드를 사용하여 사용자로부터 텍스트 기반 입력을 수집할 수 있습니다. 키보드는 일반 텍스트,e-mail, 숫자 등 다양한 유형의 입력에 대해 구성할 수 있습니다. 텍스트 필드는 target-action mechanism 과 delegate object를 사용하여 편집 중에 변경된 내용을 보고합니다.
기본적인 텍스트 편집 동작 외에도 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
        }

}

makeBorderUIView에 extension으로 작성해둔 함수이다.

extension UIView {
    ...
        func makeBorder (width : CGFloat ,color : UIColor ) {
            layer.borderWidth = width
            layer.borderColor = color.cgColor
        }
    ...
    
}

0개의 댓글