ios
Swift - delegate pattern
Product ? Project ? IT ?
2023. 2. 3. 15:50
델리게이트 패턴 - IOS 개발의 핵심이자 필수 패턴이다.
텍스트필드와 델리게이트 패턴
textField의 속성 사용법
//눌렀을 때 키보드의 타입
textField.keyboardType = UIKeyboardType.emailAddress
//처음에 힌트주기.
textField.placeholder = "이메일 입력"
//텍스트필드의 선 스타일
textField.borderStyle = .roundedRect
//클리어버튼 (누르면 다 지워지게)
textField.clearButtonMode = .always
// 키보드의 리턴 말고 go로 바꾸기 google은 search .. 등등
textField.returnKeyType = .go
텍스트필드 ?
뷰컨트롤러와와 완벽히 분리된 또 다른 객체이다.
유저와 직접적인 커뮤니케이션이 일어난다.
즉 내부에서 키보드가 동작하기 때문에
왜? 키보드는 OS의 관리 영역이기 때문
동작을 다시 뷰컨트롤러에 전달할 필요가 있다. ( 유저의 입력을 받고 그에 대한 동작을 전달 )
“동작” → 하나의 액션으로만 동작하지 않고 여러가지의 동작이 존재한다.
“동작의 예시” → 유저가 입력을 시작할때 / 유저가 입력이 시작되고 / 입력내용 전체를 삭제할지 등등..
델리게이트와 텍스트필드의 연관성
텍스트필드가 유저의 어떠한 동작(입력을 시작 등등..)이 입력이 되면 그 동작이 전달된다.
누구에게? 뷰컨트롤러에게(기본 뷰) 전달이 되고, 여기서 뷰 컨트롤러는 ‘대리자’의 역할을 가진다.
텍스트필드 안에 delegate라는 속성이 있는데, 대리자를 설정을 해준다는 것.
연관성을 코드로 알아보자
class ViewController: UIViewController, UITextFieldDelegate
// UITextFieldDelegate 프로토콜을 채택해야한다.
override func viewDidLoad() {
super.viewDidLoad()
// 아래처럼 delegate = self를 만들어줘야한다.
// 대리자를 뷰컨트롤러로 채택한다는 것. self==viewController
textField.delegate = self
setUp()
}
텍스트필드의 델리게이트 패턴 메서드 사용법
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
print(#function) //함수의 이름을 호출.
return true
}
// 텍스트필드의 입력이 시작된 시점
func textFieldDidBeginEditing(_ textField: UITextField) {
print(#function) //함수의 이름을 호출.
print("유저가 텍스트필드의 입력을 시작했다.")
}
//x버튼이 실행되지 않을 것이다. false이면 true이면 실행될 것
func textFieldShouldClear(_ textField: UITextField) -> Bool {
print(#function) //함수의 이름을 호출.
return false
}
//자주 사용할 것. 텍스트필드의 글자 내용이 (한글자 한글자) 입력될 때 호출이 되고
// 입력이 될지 안될지 허락
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
print(string)
print(#function) //함수의 이름을 호출.
return true
}
//텍스트필드의 엔터키가 눌려지면 다음동작을 허락할 것인지 아닌지
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
print(#function) //함수의 이름을 호출.
return true
}
//텍스트필드의 입력이 끝나는 것을 허락할 것인지 말지 (입력이 끝날 때 호출)
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
print(#function) //함수의 이름을 호출.
return true
}
//텍스트필드의 입력이 실제 끝났을 때 호출 (시점)
func textFieldDidEndEditing(_ textField: UITextField) {
print("유저가 텍스트필드의 입력을 끝냈다")
print(#function) //함수의 이름을 호출.
}
@IBAction func doneButtonTapped(_ sender: UIButton) {
print(#function) //함수의 이름을 호출.
}
그래서 델리게이트 패턴이 뭔데..?
즉 델리게이트 패턴은 객체와 객체간의 의사소통을 위한 것이다!
텍스트 필드(객체) ————- 뷰컨트롤러(객체) 이 사이의 동작을 전달해주는 의사소통 즉 대리자(델리게이트)
어떠한 독립된 매개체의 동작을 어떠한 또 다른 매개체에게 전달해주는 누군가(델리게이트)의 역할을 해주는 것이기 때문에
매우 중요하고 어디에서든지 한번쯤은 작동한다고 보면 될 정도의 패턴이다.
텍스트필드뿐만 아니라 여러가지에서 동작하기에 잘 알아둬야할 것이다.
참고 및 출처 : inflearn - Allen님의 강의 중 일부