iOS/UICatalog

UITextField, UITextFieldDelegate

soultreemk 2022. 4. 4. 13:53

UITextFieldDelegate: 텍스트 필드 객체의 텍스트 편집 및 유효성 검사를 관리하는데 사용

사용자가 입력한 텍스트를 검증하고 키보드와의 특정 상호작용에 응답하며, 전체 편집 프로세스를 제어하는데 이 메소드들을 사용한다. 편집은 텍스트 필드가 first responder가 되기 직전에 시작되고 키보드(또는 할당된 input view)를 표시한다. 편집 과정의 흐름은 다음과 같다.

 

키보드를 내리고 싶을 때

두가지 방법이 있다.

  • 키보드의 리턴키를 눌러서 끝내기
    키보드의 리턴키를 누르면 textFieldShouldReturn(_:) 델리게이트 메소드가 호출된다.
    이 메소드 내에서 textField.resignFirstResponder() 메소드를 호출하면 된다.
  • func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true }
  • 화면 다른 곳을 터치시켜서 끝내기
    UIViewController의 touchesBegan(_:, with:) 메소드를 오버라이드하고 내부에서 view.endEdting(_:) 메소드를 호출한다.
  • override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { self.view.endEditing(true) }

UITextFieldDelegate 메소드 호출 순서(Keyboard-Related Notification은 생략)

  1. textField가 firstResponder가 되기 전에, textFieldShouldBeginEditing(_:) 메소드를 호출
    - 텍스트 필드의 내용의 편집을 허용하거나 방지하려면 이 메소드를 사용
  2. textField가 firstResponder가 된다.
    시스템은 키보드(또는 텍스트 필드의 input view)를 표시하고 필요에 따라 keyboardWillShowNotificationkeyboardDidShowNotification 알림을 전송.
    키보드나 다른 input view가 보이면, 
    keyboardWillChangeFrameNotificationkeybardDidChangeFrameNotification 알림을 대신 전송
  3. textFieldDidBeginEditing(_:) 메소드를 호출
  4. 1) text가 바뀔 때 마다, textField(_:shouldChangeCharactersIn:replacementString:) 메소드를 호출한다. 이 메소드는 Bool 타입을 리턴하여 편집 유무를 확인한다. 이때 shouldChangeCharactersIn 인자는 편집될 범위를 나타내고, replacementString은 대체할 문자를 나타낸다.
    2) 사용자가 텍스트를 지우기 위해 내장된 버튼을 누르면 textFieldShouldClear(_:) 메소드를 호출한다.
    3) 사용자가 키보드의 리턴버튼을 누르면 textFieldShouldReturn(_:) 메소드를 호출한다.

5. textField가 firstResponder를 resign하기 직전에, textFieldShouldEndEditing(_:) 메소드를 호출한다.
    Bool 타입을 반환한다. 현재 textField에 입력된 텍스트의 validation을 검증할 때 주로 사용한다.

6. textField가 firstResponder를 resign한다.

7. textFieldDidEndEditing(_:) 메소드를 호출한다.