UITextFieldDelegate를 예제와 함께 알아봐요!

delma·2020년 3월 22일
8

iOS

목록 보기
12/16

텍스트 필드 객체의 텍스트 편집 및 유효성 검사를 관리하는데 사용하는 선택적 메소드 셋.

Declaration

protocol UITextFieldDelegate

Overview

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

  1. first responder가 되기 전에 텍스트 필드는 델리게이트의 textFieldBeginEditing(_:) 메소드를 호출한다. 텍스트 필드의 내용의 편집을 허용하거나 방지하려면 이 메소드를 사용하면 된다.

  2. 텍스트 필드가 first responder가 되면,
    이에 시스템은 키보드(또는 텍스트 필드의 input view)를 표시하고 필요에 따라 keyboardWillShowNotification, keyboardDidShowNotification 알림을 전송한다. 키보드나 다른 input view가 보이면, 시스템은 keyboardWillChangeFrameNotification, keybardDidChangeFrameNotification 알림을 대신 전송한다.

  3. 텍스트 필드는 델리게이트의 textFieldDidBeginEditing(_:) 메소드를 호출하고 textDidBeginEditingNotification 알림을 전송한다.

  4. 텍스트 필드는 편집 중에 다양한 델리게이트 메소드를 호출한다

    • 현재 텍스트가 변경될 때마다 textField(_:shouldChangeCharactersIn:replacementString:) 메소드를 호출하고 textDidChangeNotification 알림을 전송한다.
    • 사용자가 텍스트를 지우기 위해 내장된 버튼을 누르면 textFieldShouldClear(_:) 메소드를 호출한다.
    • 사용자가 키보드의 리턴버튼을 누르면 textFieldShouldReturn(_:) 메소드를 호출한다.
  5. first responder로서 끝나기 전에, 텍스트필드는 델리게이트의 textFieldShouldEndEditing(_:) 메소드를 호출한다. 현재 텍스트를 검증하려면 여기서 하면 된다.

  6. 텍스트 필드가 first responder로서 끝날 때, 시스템은 필요에 따라 키보드를 숨기거나 조정한다. 키보드를 숨길때 시스템은 keyboardWillHideNotification,keyboardDidHideNotification을 전송한다`

  7. 텍스트 필드는 델리게이트의 textFieldDidEndEditing(_:) 메소드를 호출하고 textDidEndEditingNotification 알림을 전송한다.






Example

이 델리게이트를 이용해 1.텍스트필드에 입력받는 길이에 따라 텍스트 필드 테두리의 색상을 바꿔보고, 2.입력 길이를 제한 하는 예제를 함께 해봐요!

먼저 스토리보드에 이렇게 텍스트 필드를 추가해줬어요!

그 다음 텍스트필드를 ViewController와 바인딩해주고,
UITextFieldDelegate 프로토콜을 채택해주었어요

여기서 잊지 말아야 할 것은 16번째 줄에
텍스트 필드의 대리자를 내가 할게!! 라고 선언해준 부분이예요.! 이렇게 선언해주고 나면, 해당 델리게이트의 메소드들을 사용할 수 있어요 ㅎㅎ

입력받는 길이에 따른 액션을 취해야 하니까, 계속해서 사용자의 입력값을 받아오면 좋겠죠?
그러려면 앞에 문서로 알아본
textField(_:shouldChangeCharactersIn:replacementString:) 메소드를 사용해볼게요!

먼저 텍스트 필드의 보더 너비를 1.0 으로 지정해주고,
텍스트 필드 텍스트의 카운트가 10 미만인 경우 보더 컬러를 red로, 10 이상 20 미만인 경우 green이 되도록 했어요.

여기서 return 값을 false로 주게 되면 사용자가 입력하는 사항이 텍스트필드에 보여지지 않게돼요!

이쯤에서 화면이 어떻게 바뀌는지 확인해볼까요?

입력된 텍스트의 길이에 따라 보더 컬러가 잘 변경되는 걸 볼 수 있어요 ! +_+

그럼 여기에서 추가적으로 사용자의 입력할 수 있는 텍스트의 길이를 제한하려면 어떻게 하면 될까요?
동일한 메소드 안에서 할 수 있답니다 ㅎㅎㅎ

이 메소드의 파라미터가 3개 있는데, range는 교체할 문자의 범위이고, string은 지정된 범위(range)의 교체된 문자열로 일반적으로 사용자가 입력하는 텍스트 하나로 볼 수 있어요! 어디서 복사해서 붙여넣기 한 경우에는 그 문자열 전부로 볼 수 있습니다.

여기에서 텍스트 필드의 현재 텍스트 길이 + 사용자가 입력하는 텍스트 길이 - 지워질 길이를 새로운 변수에 담아, 이 newLength가 20보다 크면 false를 리턴하게 해 이 이상은 입력되지 않도록 제한할 수 있답니다.!

실제로 이대로 코드를 실행해보면, 20자 이상에서는 더 입력되지 않는 걸 보실 수 있어요

UITextFieldDelegate가 제공하는 프로토콜을 이용해서 텍스트 필드에 우리가 원하는 대로 이런 저런 기능을 추가할 수 있어서 참 좋군요! 😇

profile
🌐Code makes world better

1개의 댓글

comment-user-thumbnail
2020년 3월 23일

오오 어제 쓰신글이라면... 미리 해보셨군요... 역촋...

답글 달기