iOS/UIKit

[프로토콜] UITextFieldDelegate 공식문서 뜯어보기

kyxxn 2024. 4. 12. 00:38
728x90

학습 목표

  1. Delegate 디자인 패턴을 익힘
  2. UITextFieldDegate 프로토콜을 익힘

학습 내용

Delegate 디자인 패턴

객체가 자신의 기능을 다른 객체에게 위임하여 기능을 실행하는 것 Delegate는 프로토콜로 구현됨, *(Delegate) = 위임하다

UITextField

NSObject - UIResponder - UIView - UIControl - UITextField

위 사진의 예로 이번 UITextFieldDelegate를 설명하겠다.

  1. UITextField에 글자를 입력
  2. 바꾸기 버튼을 누름
  3. UILabel에 1번에서 작성한 글자가 보이게 됨

UITextFieldDegate

@MainActor
protocol UITextFieldDelegate

UITextField에서 발생하는 이벤트들을 직접 처리하지 않고, 다른 객체(대리자)한테 위임하겠다.

  1. UITextFieldDelegate를 채택함
  2. 위임하고 싶은 (UITextField의 객체).delegate를 지정해준다. 여기서 self란 어떤 대상 ?
  3. myTextField에서 발생하는 이벤트는 모두 self가 처리함

왜 Delegate 패턴을 사용할까 ?

  1. 특정 이벤트에 대해 커스텀 동작을 정의할 수 있음
  2. 코드의 재사용성과 유지보수를 높일 수 있음

커스텀 동작 정의

  • TextField의 글이 변경될 때마다 메소드를 호출하고, 알림을 게시한다. textField(_:shouldChangeCharactersIn:replacementString:)
    • 사용법 및 예제 
    • func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if (myTextField.text == "not enable"){ return false } increase() return true } func increase() { print(i) i+=1 }
    • 회원가입 때, 아이디/비밀번호 정규식 확인하면 될듯 ?
  • 사용자가 내장된 버튼을 탭하여 텍스트를 지울 때 메소드를 호출한다. (텍스트 필드에서 전체삭제 누르면 동작함) func textFieldShouldClear(_:)
    • 사용법 및 예제
myTextField.clearButtonMode = .whileEditing


func textFieldShouldClear(_ textField: UITextField) -> Bool {
    // 대화 상자 생성
    let alert = UIAlertController(title: "확인", message: "정말로 내용을 지우시겠습니까?", preferredStyle: .alert)
    
    // "예" 버튼을 눌렀을 때의 동작 추가
    alert.addAction(UIAlertAction(title: "예", style: .default, handler: { action in
        // 사용자가 '예'를 선택한 경우, 텍스트 필드 내용을 실제로 지움
        textField.text = ""
    }))
    
    // "아니요" 버튼 추가
    alert.addAction(UIAlertAction(title: "아니요", style: .cancel, handler: nil))
    
    // 대화 상자 표시
    present(alert, animated: true)
    print("clear")
    
    // 사용자의 응답을 기다리기 때문에, 바로 지우지 않음
    return false
}

  • 사용자가 키보드의 복귀 버튼을 탭할 때 메소드를 호출한다. (엔터 치면 동작함)
    textFieldShouldReturn(_:)
    • 사용법 및 예제
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    myLabel.text = myTextField.text
    return true
}

 

 

 

TMI

사용자 텍스트 필드 창에 입력하다가 폰을 내려놓거나, 바닥에 떨어뜨린 경우 흔들림 감지로 인해 “실행 취소” 창이 뜬다.

이 내용은 우리가 수정 불가능함

단, 흔들림을 감지하는 메소드는 있는데,

UIResponder 클래스의 motionEnded(_:with:) 메소드를 이용하면 됨

카카오톡에서 앱 흔들면 QR 뜨는게 이런 메소드 때문인듯

override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
    if motion == .motionShake {
        // 사용자가 디바이스를 흔들었을 때 실행할 코드
    }
}

배운 점

  1. UIKit의 계층 구조를 세밀하게 살펴봄 NSObject부터 UIApplication, UIView, UIVC .. 등등
  2. UITextFieldDelegate를 통해 Delegate 패턴 익힘 내부에 많은 메소드들을 한 번씩 써봄
  3. 앱 흔들기 기능이 UIResponder 클래스의 motionEnded 메소드라는 것을 알게 됨
  4. extension 안에 저장 프로퍼티 추가 불가능 → 인스턴스의 메모리 레이아웃에 영향을 주니까 이미 컴파일된 타입의 메모리 레이아웃 변경 X
  5. NSObject, NSLayoutCompositional..의 NS는 NextSTEP의 약자이다. (스티브 잡스가 2번째로 만든 회사)

참조 링크

UITextFieldDelegate | Apple Developer Documentation

 

UITextFieldDelegate | Apple Developer Documentation

A set of optional methods to manage editing and validating text in a text field object.

developer.apple.com

iOS ) 왕초보를 위한 delegate정리

 

iOS ) 왕초보를 위한 delegate정리

swift 공부를 하면서 꼭 알아야하는 개념 중 하나가 delegate개념인데요, 저같은 경우에는 자료들도 다 영어고 한글로 된 설명을 봐도 너무 이해하기가 어렵더라구요 :( 요 며칠간 공부를 하다가 어

zeddios.tistory.com