BOID

[iOS] 최초응답자 (First Responder)란? 본문

IOS 시작기

[iOS] 최초응답자 (First Responder)란?

HoonIOS 2021. 4. 22. 12:34

안녕하세요 HoonIOS입니다. :)

정말 오랜만에 포스팅을 하는 것 같네요 :)

 

이번 주는 바빠서 포스팅을 제대로 못했습니다. ㅠㅠ

 

이번에는 텍스트 필드 델리게이트을 공부하던 중 나왔던 최초 응답자에 대해 포스팅을 하려고 합니다.

 

 최초 응답자 란?

 

우선 최초응답자를 설명하기 전에 UIWindow객체를 알아야 합니다.

 

UIWindow 객체란 사용자에 가장 가까이 위치한 객체입니다.

사용자로부터 발생하는 터치 관련 이벤트를 내부 객체로 전달하는 역할을 담당합니다.

 

그냥 이렇게 글로보면 모르시겠죠? 재미도 없고.... 자 다음 view의 계층에서 UIWindow객체의 위치를 보겠습니다.

 

 

왼쪽에 있는 파란색 층이 UIWindow층이 됩니다. 오른쪽 층을 보시면 UIWindow는 뷰 컨트롤러, 뷰를 포함하고 있습니다. 

 

따라서 위에 설명을 한 것처럼 이벤트가 발생했을때 제일 먼저 관련 이벤트를 내부 객체로 전달을 하고 우선적으로 응답할 객체를 가리키는 최초 응답자 포인터를 가지고있습니다.

 

음... 그래도 헷갈리시다면 간단한 예시를 한번 살펴보겠습니다.

 

음.... 저번에 포스팅했던 텍스트 필드( boidevelop.tistory.com/65 )를 예를 들어 설명을 해보겠습니다.

사용자가 텍스트 필드에 터치 이벤트를 주면은 UIWindow는 이 이벤트를 내부로 전달을 하고 최초 응답자 포인터를 텍스트 필드로 옮겨줍니다.

 

그러면 이제 최초 응답자는 텍스트 필드가 되므로 모바일 내의 가상 키보드가 등장을 하게 됩니다.

 

이제 핸드폰에서 발생하는 터치 스와이프 같은 이벤트는 모두 최초 응답자 포인터에 연결된 객체에 전달을 하게 됩니다.

 

그럼 이제 텍스트 필드가 최초 응답자 객체를 잃게 되면 어떻게 될까요??

 

.

.

.

 

당연히 키보드가 사라지게 되겠죠? ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ 쉽다 쉬어~ 

 

 

어느 한 객체를 최초 응답자를 만들려면 어떻게 해야 될까요?

 

바로 그 객체에 대한. becomeFirstResponder( ) 메서드를 호출하면 됩니다. 

단, 이 메서드는 UIResponse클래스에 정의가 되어 있어. becomeFirstResponder( ) 메서드를 사용하기 위해서는 UIResponse클래스를 상속해야 합니다.

 

 

텍스트 필드 예제로 코드 작성을 하실 때 아래와 같이 사용을 다했는데 화면 어디에 터치를 해도 키보드가 내려가지 않아  뭐야 왜 이래 xCode버그인가...라는 생각을 하신 적이 있을 수 있습니다. ( 아니신가요... 저만 그런가.... )

 

이렇게 키보드가 안 내려가는 이유는 최초 응답자가 텍스트 필드에 가있을 뿐만 아니라 객체들은 최초 응답자를 뺏기고 싶어 하지 않은 소유욕을 가지고 있기 때문에 강제로 빼앗지 않는 이상 최초 응답자를 주지 않습니다 ㅠㅠ

 

한번 진짜로 안 주는지 키보드가 안 내려가는지 확인을 해보겠습니다. :)

 

봐봐요... 빈 공간을 계속 클릭을 해도 안 없어집니다...

 

바로 처음 텍스트 필드를 클릭하면서 최초 응답자가 텍스트 필드의 객체에 갔기 때문에 키보드가 내려가지 않는 것을 알 수 있습니다.

 

그럼 어떻게 해야 될까요? 최초 응답자를 뺏고 싶은데....

 

정답은 바로. resignFirstResponder( ) 메서드를 호출하면 됩니다. 이것도 앞. becomeFirstResponder( ) 메서드와 같이 UIResponder클래스에 정의되어 있어 해당 메서드를 사용하려면 상속을 해야 합니다.

 

 

 

그럼 이제 이 텍스트 필드에서 최초 응답자로 만들어 앱이 켜지자마자 키보드가 실행되게 자동으로 텍스트 필드는 최초 응답자인 경우를 봐보겠습니다.

 

 

이렇게 만들려면 어떻게 해야 될까요? 바로 viewDidLoad라는 생명주기 메서드에. becomeFirstResponder( ) 메서드를 호출하면 됩니다.

 

( 혹시 생명주기 viewDidLoad에 대해 모르신다면 boidevelop.tistory.com/15 여기서 읽고 오시는 것을 추천드립니다. )

 

* 코드 설명

  • 위 코드와 같이 viewDidLoad에서 해당 객체에. becomeFirstResponder( ) 메서드를 선언해줘 최초 응답자를 텍스트필드에게 주면됩니다. 

이제 최초응답자를 텍스트필드에 줬으니 이제는 뺏어야겠죠? 그 코드를 한번 봐보겠습니다.

 

 

* 코드 설명

  • 최초응답자를 뺏어오는 메서드는. resignFirstResponder( ) 메서드라고 했습니다.
  • 그런데 여기서 func textFieldShouldReturn(_ textField:) -> Bool 메서드가 있습니다. 이 함수는 텍스트 필드의 델리게이트 메서드로 return키를 누르게 되면 실행되는 메서드입니다. 따라서 리턴키를 누르면 최초 응답자를 뺏어가는 형태의 코드를 작성한 것입니다.

 

자 이제 영상을 통해 진짜로 리턴키를 누르면 최초 응답자를 뺏어가 키보드가 내려가는지 한번 확인을 해보겠습니다.

 

 

리턴키를 누르면 최초응답자를 잃어 키보드가 내려가는 것을 확인할 수 있었습니다. :)

 

이렇게 최초 응답자에 대해 알아봤는데요. 최초 응답자는 상당히 중요하므로 잘 기억하셔야 됩니다. 뭐 중요하다고 말씀 안 드려도 읽어보시면서 어 이거 좀 중요한데...라고 생각을 하셨을 수도 있습니다. ㅎㅎ

 

반응형
Comments