학습 목표
- Delegate 디자인 패턴을 익힘
- UITextFieldDegate 프로토콜을 익힘
학습 내용
Delegate 디자인 패턴
객체가 자신의 기능을 다른 객체에게 위임하여 기능을 실행하는 것 Delegate는 프로토콜로 구현됨, *(Delegate) = 위임하다
UITextField
NSObject - UIResponder - UIView - UIControl - UITextField
위 사진의 예로 이번 UITextFieldDelegate를 설명하겠다.
- UITextField에 글자를 입력
- 바꾸기 버튼을 누름
- UILabel에 1번에서 작성한 글자가 보이게 됨
UITextFieldDegate
@MainActor
protocol UITextFieldDelegate
UITextField에서 발생하는 이벤트들을 직접 처리하지 않고, 다른 객체(대리자)한테 위임하겠다.
- UITextFieldDelegate를 채택함
- 위임하고 싶은 (UITextField의 객체).delegate를 지정해준다. 여기서 self란 어떤 대상 ?
- myTextField에서 발생하는 이벤트는 모두 self가 처리함
왜 Delegate 패턴을 사용할까 ?
- 특정 이벤트에 대해 커스텀 동작을 정의할 수 있음
- 코드의 재사용성과 유지보수를 높일 수 있음
커스텀 동작 정의
- 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 {
// 사용자가 디바이스를 흔들었을 때 실행할 코드
}
}
배운 점
- UIKit의 계층 구조를 세밀하게 살펴봄 NSObject부터 UIApplication, UIView, UIVC .. 등등
- UITextFieldDelegate를 통해 Delegate 패턴 익힘 내부에 많은 메소드들을 한 번씩 써봄
- 앱 흔들기 기능이 UIResponder 클래스의 motionEnded 메소드라는 것을 알게 됨
- extension 안에 저장 프로퍼티 추가 불가능 → 인스턴스의 메모리 레이아웃에 영향을 주니까 이미 컴파일된 타입의 메모리 레이아웃 변경 X
- 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정리
swift 공부를 하면서 꼭 알아야하는 개념 중 하나가 delegate개념인데요, 저같은 경우에는 자료들도 다 영어고 한글로 된 설명을 봐도 너무 이해하기가 어렵더라구요 :( 요 며칠간 공부를 하다가 어
zeddios.tistory.com
'iOS > UIKit' 카테고리의 다른 글
[UIKit] UISegmentedControl 사용해보기 (0) | 2024.06.17 |
---|---|
iOS 네트워크 통신 (1/3) - 개요 (URLSession, Alamofire, Moya) (0) | 2024.05.12 |
[UIKit] Interface Builder Outlet 연결 Strong || Weak (0) | 2024.01.24 |
[UIKit] 마주한 첫 번째 에러 (this class is not key value coding-compliant for the key) (1) | 2024.01.18 |