3일차 과제 정리
1. textField ReturnKey
func configureTextField() {
writeTextField.placeholder = "내용을 작성해주세요"
writeTextField.text = "루히짱!"
writeTextField.keyboardType = .default
writeTextField.delegate = self
}
extension LEDViewController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
}
}
코드를 설명하면
UITextFieldDelegate를 채택해주고,
해당 델리게이트 내에 있는 메소드인 textFieldShoudReturn을 내에
textField.resignFirstResponder()를 통해서 구현해준 것이다.
델리게이트 위임처리 부분을 쉽게 설명하자면,
writeTextField.delegate = self
텍스트필드의 대리인으로 self(즉, 여기서는 viewController)에게 권한을 준다는 걸 말한다.
" 야 뷰컨 내가 특별히 권한을 줄테니까 너가 대리인해! " 라는 바이브
그러면, textFieldShoudReturn은 무엇일까?
이걸 알기 위해서는 UITextFieldDelegate에 대해 먼저 알아보자,
UITextFieldDelegate
요놈 자식은 애플 공식문서에서 아래와 같이 설명하고 있다.
A set of optional methods to manage the editing and validation of text in a text field object.
번역하면, " 텍스트 필드 내에 있는 텍스트의 편집과 유효성을 관리하는 선택적 메소드의 집합 "이라고 한다.
그러니까, 정확히 말하자면 텍스트 필드를 관리할 수 있는 메소드가 있다는 것임
텍스트필드는 중요한 변경사항에 응답하기 위해서 이 델리게이트의 메소드를 호출한다고 한다.
- 사용자가 타이핑한 텍스트가 유효한지 체크하고,
- 키보드의 상호작용에 응답하고,
- 전반적인 편집 프로세스를 컨트롤 한다.
그리고 마지막 줄을 보자면!
텍스트 필드가 첫 번째 responder(긍까, 응답자임)가 되어서 키보드를 표시하기 직전에 편집이 시작된다.
전반적인 프로세스도 나와서 그걸 보자면,
1. textFieldShouldBeginEditing(_:) : 첫 번째 responder가 되기 전에 이 메소드가 불린다.
어떻게 사용하냐! : 텍필의 콘텐츠의 편집을 허가하거나 막는다
여기서부터 텍필이 first responder가 된 후를 말하는데
2. 시스템이 키보드를 보여주고, keyboardWillShowNotification / keyboardDidShowNotification 알림을 필요하면 post한다.
근데 이미 키보드가 보이고 있다면, 저 위 노티 대신에 시스템이 keyboardWillChangeFrameNotification and keyboardDidChangeFrameNotification 를 post 한다고 한다.
이 키보드 관련 메소드는 다음에 차차 살펴보자..ㅎㅎ
3. textFieldDidBeginEditing(_:) : 텍스트 필드가 이 메소드를 부르고 textDidBeginEditingNotification 를 post한다.
4. 이제 텍필이 편집되는 동안에 다양한 메소드를 부를 수 있는데
- text가 현재 변할 때, textField(_:shouldChangeCharactersIn:replacementString:) / textDidChangeNotification
- 텍필 내에 있는 버튼을 tap해서 텍스트를 삭제하기 위해서 textFieldShouldClear(_:)
- 키보드의 return 버튼을 tap하면 호출되는 textFieldShouldReturn(_:)
5. 첫 번째 responder에서 물러나기 전에는 textFieldShouldEndEditing(_:) 를 호출하고 이 메소드를 통해 현재 텍스트를 체크한다.
자, 여기서부터는 우리의 텍필이가 첫 번째 responder에서 물러난 시점이다.
6. 시스템이 알아서 또는 적절히 대응해서 키보드를 숨긴다. (필요에 따라서..)
키보드를 숨기면 처음 키보드가 올라왔을 때와 다르게 keyboardWillHideNotification and keyboardDidHideNotification 를 부른다.
7. 키보드도 불렀으니, 텍필도 부르겠지?
textFieldDidEndEditing(_:) method and textDidEndEditingNotification 가 불려진다.
전반적인 프로세스가 이렇다!
이 부분을 플젝하면서 알고 있었는데 새롭게 알게 된 거는 notification을 post한다는 점?
예를 들어서, textDidEndEditingNotification 이걸 통해서 내가 이해한 바로 설명하자면,
이 아이는! notification인데 옵저버에게 알림을 때리는 놈이다.
언제? -> textField의 편집 세션이 끝났을 때!
아니,, 알고 있었냐고.. 요놈들도 노티피케이션을 던지고 받는 걸 통해서 동작한다는 것을... 제법 신기방기
여하튼,
공식문서에 가면 좀 더 메소드들에 대해 디테일한 설명이 있는데 이건 그냥.. 플젝하며 익히자^^
그냥 그룹화해서 간단하게만 보며는
1. 편집을 관리하는 것
2. 텍필의 텍스트를 편집하는 것
3. 텍스트의 선택을 관리하는 것
4. Context Menu를 제공하는 것 -> beta 부분으로 나온 것 (아마 WWDC22? 에서 이번에 새롭게 설명해준 것과 관련된 거 같움)
이렇게 델리게이트 내의 메소드가 나눠진다고 함
자, 다시!!!! 과제 부분으로 돌아가자면!
textFieldShoudReturn이 뭐냐는 질문에 대해 답은 나온 것이다. 빨간색 부분을 보면 키보드 return 버튼을 눌렀을 때 호출되는 놈
이 메소드 내에서 우리가 조작대면 키보드를 내릴 수 있다는 것임!
그게 바로 textField.resignFirstResponder() 인데
이 또한 공식문서에서 자세하게 설명해주고 있다. 새삼.. 그동안 스택오버플로우나 블로그만 전전해다닌 내 자신이 멍청이같네
친절하게 설명하고 있는 애공문(애플공식문서),,,,
막줄을 보면, return 눌러서 내리고 싶음 -> resignFirstResponder() 써라!
이놈 자식은 파파고 써서 번역돌리면
" 알립니다 이 개체는 창에 긴급 구조 기관으로서의 지위를 포기하라는 요구를 받아 왔다. " 라는 개소리가 나온다.
.. 머라는 거..?;;
근데 하나 유심히 봐야 하는 거가,, 지위 포기!..ㅋㅋㅋ 그렇다. 지위 포기를 한다는 것임.
Bool 값을 반환하는 놈이다.
그렇기에 Bool을 반환값으로 요구하는 우리의 textFieldShouldReturn 에게서 요놈자식을 써줄 수 있다!
true를 반환하면 first responder로서의 지위를 내려놓는다는 것이고,
false는 지위 포기 못한다는 거겠지
자! 첫 번째 과제 끝!
2. DidEndOnExit
이건 진짜 처음 보는 아이다.
스보를 자주 안써서 이렇게 다채롭게 event를 줄 수 있는 걸 처음 알았는데 제법 많다..
구글링을 해보면 저 DidEndOnExit의 @IBAction을 연결하면 키보드의 return(또는 done)을 누르면
키보드가 알아서 사라지는 기능이 자동으로 추가된다고 한다.
제법 신기하쥬?
아래처럼 해줘보면 return 키를 누르는 시점에 콘솔창에 프린트문이 출력이 된다.
글구 저 다채로운 event가 정리된 거가 있어서 가져오자면,
3. View isHidden 토글 형태 구현
위에 있는 view를 나는 backView라는 이름을 지어줬고,
tapGestureClicked가 동작하는 메소드 내에
backView.isHidden = !backView.isHidden을 해줬다.
이게 처음보면 참 이해가 안되는 코드이다..
글서 원리?라고 해야 하나? 내가 처음 이해 안된 시점으로 돌아가 이걸 쉽게 이해할 수 있었던 것은
토글이라고 보면 된다. 저 자체가!
이케 뷰디드로드에 우선 처음 view가 로드되었을 때 backView.isHidden를 찍어보면 false가 나온다.
숨겨지지 않은 상태!
그리고 tapGestrue~ 동작 부분에도 찍어주면
tap을 처음하는 시점에 true로 값이 바뀌는 걸 볼 수 있다.
근까,, 총합해서 다시 설명하면,
초기 false였던 backView.isHidden에게 !backView.isHidden이라는 값을 넣어주다는 거다.
그러면 false의 반대(!false)인 true가 들어가고
true인 상태에서 다시 !backView.isHidden 값을 넣어주면 false가 되어서 토글 형식으로 구현된다는 것이다
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] Rendering Mode, Build Phases, NavigationController, TabBarController (0) | 2022.07.11 |
---|---|
[iOS] 1주차에 새롭게 알게 된 것들 (0) | 2022.07.10 |
[iOS] SF Symbols, iOS 계층구조, 상속 (0) | 2022.07.05 |
[iOS] 애플의 생태계 및 기초적인 개념 (0) | 2022.07.05 |
[iOS] Mac Catalyst가 뭔데요? (2) | 2022.07.05 |